Files
itgmania212121/Themes/_fallback/BGAnimations/ScreenSetBGFit overlay.lua
T
2014-08-30 16:14:03 -07:00

150 lines
6.6 KiB
Lua

-- General layout: There is one choice for each possible background fitting
-- mode. Each choice will have three examples showing how backgrounds of
-- common aspect ratios will be stretched or clipped by that fitting mode.
-- fit_choices will be used later to tell the actor that controls input what
-- actors to use for each choice.
local fit_choices= {}
-- actors will contain all the actors on the screen.
local actors= {}
-- width_per_choice is how much of the screen width will be used to separate
-- each choice
local width_per_choice= _screen.w / #BackgroundFitMode
-- xstart is the x position of the first choice. It starts at
-- width_per_choice / 2 because that's the x coordinate of the center of the
-- first choice.
local xstart= width_per_choice / 2
-- mini_screen_w and mini_screen_h are the size of the miniature screen used
-- in the examples.
local mini_screen_w= _screen.w * .1
local mini_screen_h= _screen.h * .1
-- This function returns a BitmapText that will be used to label each example
-- in each choice.
-- w and h are the width and height of the aspect ratio, passed in so they
-- can be displayed to be read.
function BGFitNormalExampleText(w, h)
return Def.BitmapText{
-- To use a different font for the text, change the Font field.
Name= "example_label", Font= "Common Normal",
-- The "BG" part of the text is fetched with THEME:GetString so that it
-- can be translated.
Text= w .. ":" .. h .. " " .. THEME:GetString("ScreenSetBGFit", "BG"),
InitCommand= function(self)
-- This positions the text underneath its corresponding example.
self:y(mini_screen_h * .5 + 9)
self:zoom(.375)
end,
OnCommand=cmd(shadowlength,1)
}
end
-- This loop goes through all the array elements of the BackgroundFitMode
-- table and creates a choice actor for each one. The BackgroundFitMode
-- table contains an entry for each background fitting mode.
for i, mode in ipairs(BackgroundFitMode) do
actors[#actors+1]= Def.ActorFrame{
Name= mode, InitCommand= function(self)
-- This adds the actor to fit_choices so it can be used by the input
-- controller.
fit_choices[i]= self
-- This positions the choice on the screen. Choices are placed in a
-- row across the center of the screen, evenly spaced.
self:xy(xstart + ((i-1) * width_per_choice), _screen.cy)
end,
Def.BitmapText{
-- This actor is a label for the choice, so the player knows the name
-- of their choice.
Name= "mode_label", Font= "Common Normal",
Text= THEME:GetString("ScreenSetBGFit", ToEnumShortString(mode)),
InitCommand= function(self)
-- Position the label above the topmost example.
self:y(mini_screen_h * -2.5)
self:zoom(.75)
end,
OnCommand=cmd(diffusebottomedge,color("0.875,0.875,0.875");shadowlength,1)
},
-- BGFitChoiceExample is a function that creates an example to show how
-- a bg with a given aspect ratio is affected by the fitting mode for
-- this choice. It takes a number of parameters that control how the
-- example is created.
-- The simplest way to modify it to suit your theme is to just change
-- the png files and the two colors.
BGFitChoiceExample{
-- exname is the name of the image in Graphics that will be used as an
-- example bg to show distortion/cropping. "16_12_example.png" means
-- that "Graphics/ScreenSetBGFit 16_12_example.png" will be loaded.
exname= "16_12_example.png",
-- x and y are the position this example will be placed at.
-- x is 0 because the x positioning was handled above, when the choice
-- this example is part of was positioned.
-- This is the first example of 3, so y is set to position it above
-- the other two.
x= 0, y= mini_screen_h * -1.5,
-- mini_screen_w and mini_screen_h are the size of the miniature screen
-- the example will draw.
mini_screen_w= mini_screen_w, mini_screen_h= mini_screen_h,
-- example_function is the background fitting function for the mode
-- that will be set by this choice. bg_fit_functions is a table
-- that contains a function for each mode, so we set example_function
-- to the element of bg_fit_functions that has the same name as the
-- mode this choice is for.
example_function= bg_fit_functions[mode],
-- example_label is an actor that will be used to label this example,
-- so the player knows what size of bg is shown in this example.
example_label= BGFitNormalExampleText(16, 12),
-- sbg_color is the color of the quad representing the screen in the
-- example. sbg_color is the color of the outline representing the
-- screen in the example.
-- The quad is visible behind the example bg, so it's seen around the
-- edges when the example doesn't fill the miniature screen.
-- The outline is drawn over everything else so the player can see what
-- part of the example bg will be cut off.
sbg_color= color("0,0,0,1"), soutline_color= color("#39b54a")},
-- The parameters passed to the other examples have the same meaning as
-- above.
BGFitChoiceExample{
exname= "16_10_example.png", x= 0, y= 0,
mini_screen_w= mini_screen_w, mini_screen_h= mini_screen_h,
example_function= bg_fit_functions[mode],
example_label= BGFitNormalExampleText(16, 10),
sbg_color= color("0,0,0,1"), soutline_color= color("#39b54a")},
BGFitChoiceExample{
exname= "16_9_example.png", x= 0, y= mini_screen_h * 1.5,
mini_screen_w= mini_screen_w, mini_screen_h= mini_screen_h,
example_function= bg_fit_functions[mode],
example_label= BGFitNormalExampleText(16, 9),
sbg_color= color("0,0,0,1"), soutline_color= color("#39b54a")},
}
end
-- LoseFocus and GainFocus will be used on each choice to show which one
-- is currently selected.
local function LoseFocus(self)
-- We use stoptweening so that the player can't overflow the tween buffer
-- through repeated rapid input. Using stoptweening means that the actor
-- will stop at its current state and start tweening towards the new state
-- we are about to add to the tween stack.
-- If finishtweening was used, there would be jerking from the actor
-- suddenly reaching the end tween state.
self:stoptweening()
-- .25 seconds is a fine time for changing zoom size.
self:smooth(.125)
-- Unfocused choices are normal size.
self:zoom(1)
end
local function GainFocus(self)
self:stoptweening()
self:smooth(.125)
-- The choice with focus is 1.5 size.
self:zoom(1.25)
end
-- BGFitInputActor returns the actor that will handle input from the player
-- and apply their choice to the preference. We pass it fit_choices so that
-- it has the choice actors so it can show the player which once they have
-- selected.
actors[#actors+1]= BGFitInputActor(fit_choices, LoseFocus, GainFocus)
return Def.ActorFrame(actors)