From 6749cb2a1c117d16e8e09ea4e6a25f5da3345ecd Mon Sep 17 00:00:00 2001 From: Hersi Date: Wed, 29 Jun 2022 00:35:52 +0200 Subject: [PATCH] introduced PageManager which made it pretty to get page instances (ewww '.__name') from now page implementations use the PageManager to get page instances SplashPage fading improvements TitlePage implementation replace viewHandler calls from page implementations with 'self:onInvalidation()' fixed ListField focus implementation fixed SelfTestField crash MainMenuPage and subpages implementation --- scripts/api/page/pagemanager.lua | 60 ++++++++++ scripts/api/page/pageview.lua | 5 + scripts/titlescreen.lua | 109 ++++++++++++------ scripts/titlescreen/boot.lua | 32 +++-- .../components/checkupdatefield.lua | 4 +- .../components/colorgradientfield.lua | 2 +- .../components/inputbuttonfield.lua | 2 +- .../titlescreen/components/inputknobfield.lua | 2 +- scripts/titlescreen/components/listfield.lua | 33 +++--- .../titlescreen/components/selftestfield.lua | 8 +- .../components/servicelinkfield.lua | 2 +- .../titlescreen/components/updatefield.lua | 2 +- .../{modeselect.lua => mainmenu.lua} | 54 ++++++++- .../pages/boot/checkupdatepage.lua | 10 +- .../pages/modeselect/modeselectpage.lua | 19 +-- .../pages/modeselect/myroompage.lua | 22 ++++ .../pages/service/colorcheckpage.lua | 2 +- .../pages/service/inputcheckpage.lua | 2 +- .../pages/service/mainmenupage.lua | 38 ------ .../pages/service/screencheckpage.lua | 2 +- .../pages/service/versioninfopage.lua | 4 +- .../titlescreen/pages/splash/creditspage.lua | 46 +++++++- .../pages/splash/kshootmaniapage.lua | 101 ++++++++-------- .../pages/splash/teamexceedpage.lua | 46 +++++++- scripts/titlescreen/pages/splash/uscpage.lua | 85 +++++++------- scripts/titlescreen/service.lua | 82 +++++-------- scripts/titlescreen/splash.lua | 91 +++++++++------ scripts/titlescreen/title.lua | 77 ++++++------- 28 files changed, 585 insertions(+), 357 deletions(-) create mode 100644 scripts/api/page/pagemanager.lua rename scripts/titlescreen/{modeselect.lua => mainmenu.lua} (92%) delete mode 100644 scripts/titlescreen/pages/service/mainmenupage.lua diff --git a/scripts/api/page/pagemanager.lua b/scripts/api/page/pagemanager.lua new file mode 100644 index 0000000..dd1a59e --- /dev/null +++ b/scripts/api/page/pagemanager.lua @@ -0,0 +1,60 @@ +require "common.globals" +require "common.class" + +---@type PageManager +local instance = nil + +---@class PageManager +---@field pages Page[] +local PageManager = { + __name = "PageManager" +} + +---Create new PageManager instance +---@param params? PageManager +---@return PageManager +function PageManager.new(params) + params = params or {} + + local self = CreateInstance(PageManager, params) + + self.pages = params.pages or {} + + return self +end + +---Get PageManager instance +---@return PageManager +function PageManager.get() + if not instance then + instance = PageManager.new() + end + + return instance +end + +---Store page with default name +---@param page Page +function PageManager:storePage(page) + if self.pages[page.__name] then + game.Log(self.__name .. ":storePage() : page `" .. tostring(page) .. "` already stored, overwriting...", game.LOGGER_WARNING) + else + game.Log(self.__name .. ":storePage() : stored page `" .. tostring(page) .. "` with key '" .. page.__name .. "'", game.LOGGER_DEBUG) + end + self.pages[page.__name] = page +end + +---Get page by name or by class (default name) +---@param page string|Page +function PageManager:getPage(page) + if type(page) == "string" then + return self.pages[page] + elseif type(page) == "table" and page.__name then + return self.pages[page.__name] + end + + game.Log(self.__name .. ":getPage() : invalid parameter (" .. tostring(page) .. ")", game.LOGGER_WARNING) + return nil +end + +return PageManager \ No newline at end of file diff --git a/scripts/api/page/pageview.lua b/scripts/api/page/pageview.lua index c152621..cc60a39 100644 --- a/scripts/api/page/pageview.lua +++ b/scripts/api/page/pageview.lua @@ -34,6 +34,11 @@ end ---Navigate to page ---@param page Page # page to put on top of the pageStack function PageView:navigate(page) + if not page then + game.Log(self .. ":navigate() : page is nil, cannot navigate", game.LOGGER_ERROR) + return + end + page.viewHandler = self pushStack(self.pageStack, page) self:onNavigated(false) diff --git a/scripts/titlescreen.lua b/scripts/titlescreen.lua index c8704d6..88eacb5 100644 --- a/scripts/titlescreen.lua +++ b/scripts/titlescreen.lua @@ -1,26 +1,53 @@ -require("common.globals") -local Common = require("common.util") -local Dim = require("common.dimensions") -local Wallpaper = require("components.wallpaper") +require "common.globals" +local Common = require "common.util" +local Dim = require "common.dimensions" +local Wallpaper = require "components.wallpaper" -local PageView = require("api.page.pageview") +local PageView = require "api.page.pageview" +local PageManager = require "api.page.pagemanager" -local BootPage = require("titlescreen.boot") -local SplashPage = require('titlescreen.splash') -local ModeSelectPage = require("titlescreen.pages.modeselect.modeselectpage") -local ServiceMenuPage = require("titlescreen.pages.service.mainmenupage") +local BootPage = require "titlescreen.boot" +local CheckUpdatePage = require "titlescreen.pages.boot.checkupdatepage" -game.Log("HELLO FROM TITLESCREEN", game.LOGGER_DEBUG) -local screens = { - [BootPage.__name] = BootPage.new(), - [SplashPage.__name] = SplashPage.new(), - --title = titleScreen, - --[tostring(ModeSelectPage)] = ModeSelectPage.new(), - --[tostring(ServiceMenuPage)] = ServiceMenuPage.new() -} +local SplashPage = require "titlescreen.splash" +local KShootManiaPage = require "titlescreen.pages.splash.kshootmaniapage" +local USCPage = require "titlescreen.pages.splash.uscpage" +local TeamExceedPage = require "titlescreen.pages.splash.teamexceedpage" +local CreditsPage = require "titlescreen.pages.splash.creditspage" + +local TitlePage = require "titlescreen.title" + +local MainMenuPage = require "titlescreen.mainmenu" + +local ServiceMenuPage = require "titlescreen.service" +local InputCheckPage = require "titlescreen.components.inputbuttonfield" +local ScreenCheckPage = require "titlescreen.pages.service.screencheckpage" +local ColorCheckPage = require "titlescreen.pages.service.colorcheckpage" +local VersionInfoPage = require "titlescreen.pages.service.versioninfopage" local pageView = PageView.new() +local pageManager = PageManager.get() + +pageManager:storePage(CheckUpdatePage.new()) +pageManager:storePage(BootPage.new()) + +pageManager:storePage(KShootManiaPage.new()) +pageManager:storePage(USCPage.new()) +pageManager:storePage(TeamExceedPage.new()) +pageManager:storePage(CreditsPage.new()) +pageManager:storePage(SplashPage.new()) + +pageManager:storePage(TitlePage.new()) + +pageManager:storePage(MainMenuPage.new()) + +pageManager:storePage(InputCheckPage.new()) +pageManager:storePage(ScreenCheckPage.new()) +pageManager:storePage(ColorCheckPage.new()) +pageManager:storePage(VersionInfoPage.new()) +pageManager:storePage(ServiceMenuPage.new()) + pageView.onNavigated = function(self, back) game.Log(tostring(self) .. " navigated " .. (back and "back " or "") .. "to: " .. tostring(pageView:get()), game.LOGGER_INFO @@ -31,34 +58,42 @@ pageView.onEmptied = function(self) game.Log(tostring(self) .. " empty!", game.LOGGER_WARNING) end -local function switchScreens(newScreen) - pageView:replace(newScreen) +local pages = PageManager.get().pages +pageManager:getPage(BootPage).onInvalidation = function(self, toVersionPage) + if toVersionPage then + pageView:replace(pageManager:getPage(ServiceMenuPage)) + pageView:get():init() + pageView:navigate(pageManager:getPage(VersionInfoPage)) + pageView:get():init() + else + pageView:replace(pageManager:getPage(SplashPage)) + pageView:get():init() + end +end + +pageManager:getPage(SplashPage).onInvalidation = function(self) + pageView:replace(pageManager:getPage(TitlePage)) pageView:get():init() end -screens[BootPage.__name].onInvalidation = function(self) - switchScreens(screens[SplashPage.__name]) +pageManager:getPage(TitlePage).onInvalidation = function(self, toServiceMenu) + if toServiceMenu then + pageView:replace(pageManager:getPage(ServiceMenuPage)) + pageView:get():init() + else + pageView:replace(pageManager:getPage(MainMenuPage)) + pageView:get():init() + end end -screens[SplashPage.__name].onInvalidation = function(self) - --TODO: TitlePage - --switchScreens(screens[TitlePage.__name]) +pageManager:getPage(ServiceMenuPage).onInvalidation = function(self) + pageView:replace(pageManager:getPage(SplashPage)) + pageView:get():init() end ---[[ TODO: remaining Pages - -screens[TitlePage.__name].onInvalidation = function(self) - switchScreens(screens[ModeSelectPage.__name]) -end - -screens[ServiceMenuPage.__name].onInvalidation = function(self) - switchScreens(screens[SplashPage.__name]) -end - -]] - --local currentScreen = game.GetSkinSetting("animations_skipIntro") and screens.title or screens.boot -- show boot screen if skipIntro is not set -switchScreens(screens[BootPage.__name]) +pageView:replace(pages[BootPage.__name]) +pageView:get():init() local function deltaKnob(delta) -- can someone tell me what the hell does this do? - Hersi diff --git a/scripts/titlescreen/boot.lua b/scripts/titlescreen/boot.lua index fd49049..a61cdd5 100644 --- a/scripts/titlescreen/boot.lua +++ b/scripts/titlescreen/boot.lua @@ -1,13 +1,17 @@ -require("common.globals") -require("common.class") -require("common.filereader") -local Dim = require("common.dimensions") -local Version = require("common.version") -local Page = require("api.page.page") -local CheckUpdatePage = require("titlescreen.pages.boot.checkupdatepage") -local ServiceField = require("titlescreen.components.servicefield") -local ListField = require("titlescreen.components.listfield") -local SelfTestField = require("titlescreen.components.selftestfield") +require "common.globals" +require "common.class" +require "common.filereader" +local Dim = require "common.dimensions" +local Version = require "common.version" + +local PageManager = require "api.page.pagemanager" + +local Page = require "api.page.page" +local CheckUpdatePage = require "titlescreen.pages.boot.checkupdatepage" + +local ServiceField = require "api.page.servicefield" +local ListField = require "titlescreen.components.listfield" +local SelfTestField = require "titlescreen.components.selftestfield" ---@class BootPage: Page local BootPage = { @@ -22,8 +26,13 @@ function BootPage.new(params) local self = CreateInstance(BootPage, params, Page) + local pageManager = PageManager.get() self._networkResult = {} + pageManager:getPage(CheckUpdatePage).onInvalidation = function (page_self, reason) + self:onInvalidation(reason) + end + self:addField(ServiceField.new{posX = 32, posY = 32, label = Version.getLongVersion(), value = ""}) self:addField(ServiceField.new{posX = 64, posY = 64, label = "UNNAMED SDVX CLONE STARTUP...", value = ""}) @@ -78,7 +87,8 @@ function BootPage.new(params) IR.Heartbeat(function(res) self._networkResult = res end) -- IR doesn't like being called in a coroutine elseif status == SelfTestStatus.PASS or status == SelfTestStatus.OK then if self.viewHandler then - self.viewHandler:navigate(CheckUpdatePage.new()) + self.viewHandler:navigate(pageManager:getPage(CheckUpdatePage)) + self.viewHandler:get():init() end end end diff --git a/scripts/titlescreen/components/checkupdatefield.lua b/scripts/titlescreen/components/checkupdatefield.lua index 4aeb4a7..77ea7e6 100644 --- a/scripts/titlescreen/components/checkupdatefield.lua +++ b/scripts/titlescreen/components/checkupdatefield.lua @@ -1,6 +1,6 @@ require("common.class") local Util = require("common.util") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class CheckUpdateField: ServiceField ---@field onUpdateAvailable nil|fun(url: string, version: string) @@ -57,7 +57,7 @@ function CheckUpdateField:tick(deltaTime) self.onUpdateAvailable(self._url, self._version) self._onUpdateAvailableFired = true else - self:getParentPage().viewHandler:clear() -- Exit out of bootscreen + self:getParentPage():onInvalidation() -- Exit out of bootscreen end end end diff --git a/scripts/titlescreen/components/colorgradientfield.lua b/scripts/titlescreen/components/colorgradientfield.lua index cfbad7d..3d848bf 100644 --- a/scripts/titlescreen/components/colorgradientfield.lua +++ b/scripts/titlescreen/components/colorgradientfield.lua @@ -1,6 +1,6 @@ require("common.class") local Util = require("common.util") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class ColorGradientField: ServiceField local ColorGradientField = { diff --git a/scripts/titlescreen/components/inputbuttonfield.lua b/scripts/titlescreen/components/inputbuttonfield.lua index 067e300..2834f56 100644 --- a/scripts/titlescreen/components/inputbuttonfield.lua +++ b/scripts/titlescreen/components/inputbuttonfield.lua @@ -1,5 +1,5 @@ require("common.class") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class InputButtonField: ServiceField ---@field button integer diff --git a/scripts/titlescreen/components/inputknobfield.lua b/scripts/titlescreen/components/inputknobfield.lua index e6744b8..bbd4db4 100644 --- a/scripts/titlescreen/components/inputknobfield.lua +++ b/scripts/titlescreen/components/inputknobfield.lua @@ -1,6 +1,6 @@ require("common.class") local Util = require("common.util") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class InputKnobField: ServiceField ---@field knob integer diff --git a/scripts/titlescreen/components/listfield.lua b/scripts/titlescreen/components/listfield.lua index 7a16108..2d21f0f 100644 --- a/scripts/titlescreen/components/listfield.lua +++ b/scripts/titlescreen/components/listfield.lua @@ -1,6 +1,6 @@ require("common.class") local ContainerField = require("api.page.containerfield") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class ListField: ContainerField, ServiceField ---@field selectedIndex integer @@ -34,7 +34,7 @@ end ---@param obj? any # message object for the field function ListField:focus(obj) - if self._state == ServiceFieldState.ACTIVE then + if self.focused then return end @@ -62,6 +62,19 @@ function ListField:focus(obj) ServiceField.focus(self) end +function ListField:unfocus() + if not self.focused then + return + end + + local field = self.content[self.selectedIndex] + if field and field.unfocus then + field:unfocus() + end + + ServiceField.unfocus(self) +end + ---Add field to list container ---@param field Field function ListField:addField(field) @@ -100,16 +113,8 @@ function ListField:handleButtonInput(button) return true end - if button == game.BUTTON_BCK then - local viewHandler = self:getParentPage().viewHandler - if viewHandler then - viewHandler:back() - end - return true - end - if self.locked then - return true + return false end local direction = 0 @@ -121,7 +126,7 @@ function ListField:handleButtonInput(button) end if direction ~= 0 then - field:deactivate() + field:unfocus() self.selectedIndex = self.selectedIndex + direction @@ -131,9 +136,11 @@ function ListField:handleButtonInput(button) field = self.content[self.selectedIndex] field:focus() + + return true end - return true + return false end ---@param deltaTime number # frametime in seconds diff --git a/scripts/titlescreen/components/selftestfield.lua b/scripts/titlescreen/components/selftestfield.lua index 1a667a1..e0ba6c6 100644 --- a/scripts/titlescreen/components/selftestfield.lua +++ b/scripts/titlescreen/components/selftestfield.lua @@ -1,6 +1,6 @@ require("common.class") local Util = require("common.util") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class SelfTestStatus SelfTestStatus = { @@ -20,6 +20,7 @@ end ---@field checkTask nil|fun(): SelfTestStatus # a function that will run asynchronously on activating the Field ---@field status SelfTestStatus ---@field _thread thread +---@field _timer number local SelfTestField = { __name = "SelfTestField", COLOR_INPROGRESS = {255, 255, 255, 255}, @@ -39,6 +40,7 @@ function SelfTestField.new(params) local self = CreateInstance(SelfTestField, params, ServiceField) + self._timer = 0.0 self._thread = nil return self @@ -54,7 +56,7 @@ end function SelfTestField:_closeThread() if self._thread and coroutine.status(self._thread) ~= "dead" then - coroutine.close(self._thread) + --coroutine.close(self._thread) --only god knows why this crashes lmao end end @@ -89,6 +91,8 @@ end function SelfTestField:tick(deltaTime) self:_resumeThread() + + self._timer = self._timer + deltaTime end ---@param status SelfTestStatus diff --git a/scripts/titlescreen/components/servicelinkfield.lua b/scripts/titlescreen/components/servicelinkfield.lua index b3a2a10..e0096af 100644 --- a/scripts/titlescreen/components/servicelinkfield.lua +++ b/scripts/titlescreen/components/servicelinkfield.lua @@ -1,6 +1,6 @@ require("common.class") local LinkField = require("api.page.linkfield") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class ServiceLinkField: LinkField, ServiceField local ServiceLinkField = { diff --git a/scripts/titlescreen/components/updatefield.lua b/scripts/titlescreen/components/updatefield.lua index 5d6c591..0bc3fa3 100644 --- a/scripts/titlescreen/components/updatefield.lua +++ b/scripts/titlescreen/components/updatefield.lua @@ -1,5 +1,5 @@ require("common.class") -local ServiceField = require("titlescreen.components.servicefield") +local ServiceField = require("api.page.servicefield") ---@class UpdateField: ServiceField ---@field _timer number diff --git a/scripts/titlescreen/modeselect.lua b/scripts/titlescreen/mainmenu.lua similarity index 92% rename from scripts/titlescreen/modeselect.lua rename to scripts/titlescreen/mainmenu.lua index 98f1ff6..9848397 100644 --- a/scripts/titlescreen/modeselect.lua +++ b/scripts/titlescreen/mainmenu.lua @@ -1,3 +1,5 @@ +require "common.globals" +require "common.class" local Footer = require("components.footer") local Wallpaper = require("components.wallpaper") @@ -468,10 +470,50 @@ local function onMousePressed(button) end -return { - render = render, - reset = reset, - onKnobsChange = onKnobsChange, - onButtonPressed = onButtonPressed, - onMousePressed = onMousePressed, +local Background = require "components.background" + +local Animation = require "api.animation" +local AudioSample = require "api.audiosample" + +local Page = require "api.page.page" +local Footer = require "components.footer" + +local crew = game.GetSkinSetting("single_idol") + +---@class MainMenuPage : Page +---@field _idolAnimationState AnimationState +local MainMenuPage = { + __name = "MainMenuPage", + anims = { + idolAnimation = Animation.new("crew/anim/" .. crew, { + fps = 30, loop = true, + centered = true, x = Dim.design.width / 2, y = Dim.design.height / 2, + width = Dim.design.width, height = Dim.design.height, + }) + }, + audiosamples = { + bgm = AudioSample.new{path = "titlescreen/bgm.wav", exclusive = true, loop = true}, + } } + +function MainMenuPage.new(params) + local self = CreateInstance(MainMenuPage, params, Page) + + return self +end + +function MainMenuPage:init() + self._idolAnimationState = self.anims.idolAnimation:start() + self.audiosamples.bgm:play() +end + +function MainMenuPage:drawBackground(deltaTime) + Background.draw(deltaTime) + self._idolAnimationState:render(deltaTime) +end + +function MainMenuPage:drawForeground(deltaTime) + Footer.draw(deltaTime) +end + +return MainMenuPage \ No newline at end of file diff --git a/scripts/titlescreen/pages/boot/checkupdatepage.lua b/scripts/titlescreen/pages/boot/checkupdatepage.lua index 70dbe43..99f2355 100644 --- a/scripts/titlescreen/pages/boot/checkupdatepage.lua +++ b/scripts/titlescreen/pages/boot/checkupdatepage.lua @@ -50,14 +50,10 @@ function CheckUpdatePage.new(params) end if button == game.BUTTON_BCK then - self.viewHandler:clear() -- Cancel update, close screen + self:onInvalidation() -- Cancel update, close screen return true elseif button == game.BUTTON_STA then - -- NOTE: this is a huge ass hack, please rethink - local MainMenuPage = require("titlescreen.pages.service.mainmenupage") - local VersionInfoPage = require("titlescreen.pages.service.versioninfopage") - self.viewHandler:replace(MainMenuPage.new()) - self.viewHandler:navigate(VersionInfoPage.new()) + self:onInvalidation(true) return true end @@ -83,7 +79,7 @@ function CheckUpdatePage:handleButtonInput(button) end if button == game.BUTTON_BCK then - self.viewHandler:back() + self:onInvalidation() end end diff --git a/scripts/titlescreen/pages/modeselect/modeselectpage.lua b/scripts/titlescreen/pages/modeselect/modeselectpage.lua index 36b7750..68a967e 100644 --- a/scripts/titlescreen/pages/modeselect/modeselectpage.lua +++ b/scripts/titlescreen/pages/modeselect/modeselectpage.lua @@ -1,18 +1,13 @@ require "common.class" -local Dim = require "common.dimensions" local Lang = require "language.call" local AudioSample = require "api.audiosample" -local Animation = require "api.animation" local Page = require "api.page.page" -local Background = require "components.background" -local Footer = require "components.footer" local Header = require "components.headers.modeSelectHeader" local crew = game.GetSkinSetting("single_idol") ---@class ModeSelectPage: Page ----@field _idolAnimationState AnimationState local ModeSelectPage = { __name = "ModeSelectPage", images = { @@ -23,14 +18,9 @@ local ModeSelectPage = { selectedButtonOverImage = gfx.CreateSkinImage("titlescreen/selected_button_over.png", 0) }, anims = { - idolAnimation = Animation.new("crew/anim/" .. crew, { - fps = 30, loop = true, - centered = true, x = Dim.design.width / 2, y = Dim.design.height / 2, - width = Dim.design.width, height = Dim.design.height, - }) + }, audiosamples = { - bgm = AudioSample.new{path = "titlescreen/bgm.wav", exclusive = true, loop = true}, cursorChange = AudioSample.new{path = "titlescreen/cursor_change.wav"}, cursorSelect = AudioSample.new{path = "titlescreen/cursor_select.wav"} }, @@ -48,18 +38,11 @@ function ModeSelectPage.new(params) end function ModeSelectPage:init() - self._idolAnimationState = self.anims.idolAnimation:start() - self.audiosamples.bgm:play() -end -function ModeSelectPage:drawBackground(deltaTime) - Background.draw(deltaTime) - self._idolAnimationState:render(deltaTime) end function ModeSelectPage:drawForeground(deltaTime) Header.draw() - Footer.draw(deltaTime) end return ModeSelectPage diff --git a/scripts/titlescreen/pages/modeselect/myroompage.lua b/scripts/titlescreen/pages/modeselect/myroompage.lua index e69de29..424e7b8 100644 --- a/scripts/titlescreen/pages/modeselect/myroompage.lua +++ b/scripts/titlescreen/pages/modeselect/myroompage.lua @@ -0,0 +1,22 @@ +require "common.class" +local Page = require "api.page.page" + +local Header = require "components.headers.myRoomHeader" + +---@class MyRoomPage: Page +---@field _idolAnimationState AnimationState +local MyRoomPage = { + __name = "MyRoomPage", +} + +function MyRoomPage.new(params) + local self = CreateInstance(MyRoomPage, params, Page) + + return self +end + +function MyRoomPage:drawForeground(deltaTime) + Header.draw() +end + +return MyRoomPage diff --git a/scripts/titlescreen/pages/service/colorcheckpage.lua b/scripts/titlescreen/pages/service/colorcheckpage.lua index 248558d..6c0bba0 100644 --- a/scripts/titlescreen/pages/service/colorcheckpage.lua +++ b/scripts/titlescreen/pages/service/colorcheckpage.lua @@ -1,5 +1,5 @@ require("common.class") -local ServicePage = require("titlescreen.pages.service.servicepage") +local ServicePage = require("api.page.servicepage") local ListField = require("titlescreen.components.listfield") local ColorGradientField = require("titlescreen.components.colorgradientfield") diff --git a/scripts/titlescreen/pages/service/inputcheckpage.lua b/scripts/titlescreen/pages/service/inputcheckpage.lua index a672a1c..83a20b8 100644 --- a/scripts/titlescreen/pages/service/inputcheckpage.lua +++ b/scripts/titlescreen/pages/service/inputcheckpage.lua @@ -1,5 +1,5 @@ require("common.class") -local ServicePage = require("titlescreen.pages.service.servicepage") +local ServicePage = require("api.page.servicepage") local InputButtonField = require("titlescreen.components.inputbuttonfield") local InputKnobField = require("titlescreen.components.inputknobfield") local ListField = require("titlescreen.components.listfield") diff --git a/scripts/titlescreen/pages/service/mainmenupage.lua b/scripts/titlescreen/pages/service/mainmenupage.lua deleted file mode 100644 index 7de6874..0000000 --- a/scripts/titlescreen/pages/service/mainmenupage.lua +++ /dev/null @@ -1,38 +0,0 @@ -require("common.class") -local ServicePage = require("titlescreen.pages.service.servicepage") -local InputCheckPage = require("titlescreen.pages.service.inputcheckpage") -local ScreenCheckPage = require("titlescreen.pages.service.screencheckpage") -local ColorCheckPage = require("titlescreen.pages.service.colorcheckpage") -local VersionInfoPage = require("titlescreen.pages.service.versioninfopage") -local ServiceLinkField = require("titlescreen.components.servicelinkfield") -local ListField = require("titlescreen.components.listfield") - ----@class MainMenuPage: ServicePage -local MainMenuPage = { - __name = "MainMenuPage", -} - ----Create a new MainMenuPage instance ----@param params? MainMenuPage # initial parameters ----@return MainMenuPage -function MainMenuPage.new(params) - params = params or {} - - params.title = params.title or "MAIN MENU" - - local self = CreateInstance(MainMenuPage, params, ServicePage) - - local list = ListField.new() - list:addField(ServiceLinkField.new{label = "INPUT CHECK", link = InputCheckPage.new()}) - list:addField(ServiceLinkField.new{label = "SCREEN CHECK", link = ScreenCheckPage.new()}) - list:addField(ServiceLinkField.new{label = "COLOR CHECK", link = ColorCheckPage.new()}) - list:addField(ServiceLinkField.new{label = "VERSION INFORMATION", link = VersionInfoPage.new()}) - list:refreshFields() - - self:addField(list) - self:refreshFields() - - return self -end - -return MainMenuPage diff --git a/scripts/titlescreen/pages/service/screencheckpage.lua b/scripts/titlescreen/pages/service/screencheckpage.lua index 32b743a..eb959b6 100644 --- a/scripts/titlescreen/pages/service/screencheckpage.lua +++ b/scripts/titlescreen/pages/service/screencheckpage.lua @@ -1,6 +1,6 @@ require("common.class") local Dim = require("common.dimensions") -local ServicePage = require("titlescreen.pages.service.servicepage") +local ServicePage = require("api.page.servicepage") ---@class ScreenCheckPage: ServicePage local ScreenCheckPage = { diff --git a/scripts/titlescreen/pages/service/versioninfopage.lua b/scripts/titlescreen/pages/service/versioninfopage.lua index a68aca3..ea8bed0 100644 --- a/scripts/titlescreen/pages/service/versioninfopage.lua +++ b/scripts/titlescreen/pages/service/versioninfopage.lua @@ -2,8 +2,8 @@ require("common.class") require("common.filereader") require("common.gameconfig") local Version = require("common.version") -local ServicePage = require("titlescreen.pages.service.servicepage") -local ServiceField = require("titlescreen.components.servicefield") +local ServicePage = require("api.page.servicepage") +local ServiceField = require("api.page.servicefield") local UpdateField = require("titlescreen.components.updatefield") local ListField = require("titlescreen.components.listfield") diff --git a/scripts/titlescreen/pages/splash/creditspage.lua b/scripts/titlescreen/pages/splash/creditspage.lua index 585a0b8..bfd82ee 100644 --- a/scripts/titlescreen/pages/splash/creditspage.lua +++ b/scripts/titlescreen/pages/splash/creditspage.lua @@ -1,11 +1,20 @@ require "common.globals" require "common.class" +local Dim = require "common.dimensions" + +local Image = require "api.image" + local Page = require "api.page.page" ---@class CreditsPage : Page +---@field logo_img Image +---@field _timer number local CreditsPage = { - + __name = "CreditsPage", + BACKGROUND_COLOR = {255, 255, 255}, + LOGO_PATH = "", + TIMEOUT = 3.0 } ---Create a new CreditsPage instance @@ -13,7 +22,42 @@ local CreditsPage = { function CreditsPage.new(params) local self = CreateInstance(CreditsPage, params, Page) + self.logo_img = Image.new(self.LOGO_PATH) + + self._timer = 0.0 + return self end +function CreditsPage:init() + self._timer = 0.0 + Page.init(self) +end + +function CreditsPage:drawBackground(deltaTime) + gfx.BeginPath() + gfx.FillColor(table.unpack(self.BACKGROUND_COLOR)) + gfx.Rect(0, 0, Dim.design.width, Dim.design.height) + gfx.Fill() +end + +function CreditsPage:drawContent(deltaTime) + local x = (Dim.design.width - self.logo_img.width) / 2 + local y = (Dim.design.height - self.logo_img.height) / 2 + + self.logo_img:setPosition(x, y) + + self.logo_img:render() +end + +function CreditsPage:render(deltaTime) + Page.render(self, deltaTime) + + if self._timer > self.TIMEOUT then + self:onInvalidation() + end + + self._timer = self._timer + deltaTime +end + return CreditsPage \ No newline at end of file diff --git a/scripts/titlescreen/pages/splash/kshootmaniapage.lua b/scripts/titlescreen/pages/splash/kshootmaniapage.lua index b7579de..35bfcbd 100644 --- a/scripts/titlescreen/pages/splash/kshootmaniapage.lua +++ b/scripts/titlescreen/pages/splash/kshootmaniapage.lua @@ -1,56 +1,23 @@ require "common.globals" require "common.class" +local Dim = require "common.dimensions" + +local Image = require "api.image" +local AudioSample = require "api.audiosample" local Page = require "api.page.page" -local splash1BgColor = {182, 0, 20} -local splash1Logo = gfx.CreateSkinImage("titlescreen/splash/ksm.png", 0) -local splash1LogoWidth, splash1LogoHeight = gfx.ImageSize(splash1Logo) - -local function splash1(deltaTime) - local splash1LogoXOffset = (Dim.design.width - splash1LogoWidth) / 2 - local splash1LogoYOffset = (Dim.design.height - splash1LogoHeight) / 2 - - calcFade(splash1Duration) - - gfx.BeginPath() - gfx.Rect(0, 0, Dim.design.width, Dim.design.height) - gfx.FillColor(splash1BgColor[1], splash1BgColor[2], splash1BgColor[3], fadeAlpha) - gfx.Fill() - - gfx.BeginPath() - gfx.ImageRect(splash1LogoXOffset, splash1LogoYOffset, splash1LogoWidth, splash1LogoHeight, splash1Logo, fadeAlpha / 255, 0) - - gfx.BeginPath() - gfx.LoadSkinFont("segoeui.ttf") - gfx.FillColor(255, 255, 255, fadeAlpha) - gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_BOTTOM) - gfx.FontSize(28) - - gfx.Text("Press START to skip...", 10, Dim.design.height - 10) - - if (splashTimer < 0) then - splashState = "splash2" - splash1SfxPlayed = false - splashTimer = 0 - return - end - - if splashTimer == 0 then - splashTimer = splash1Duration - end - - if not splash1SfxPlayed then - game.PlaySample("titlescreen/splash/splash1.wav") - splash1SfxPlayed = true - end - - splashTimer = splashTimer - deltaTime -end - ---@class KShootManiaPage : Page +---@field logo_img Image +---@field splash_sample AudioSample +---@field _timer number +---@field _sample_played boolean local KShootManiaPage = { - + __name = "KShootManiaPage", + BACKGROUND_COLOR = {182, 0, 20}, + LOGO_PATH = "titlescreen/splash/ksm.png", + SAMPLE_PATH = "titlescreen/splash/splash1.wav", + TIMEOUT = 3.0 } ---Create a new KShootManiaPage instance @@ -58,7 +25,49 @@ local KShootManiaPage = { function KShootManiaPage.new(params) local self = CreateInstance(KShootManiaPage, params, Page) + self.logo_img = Image.new(self.LOGO_PATH) + self.splash_sample = AudioSample.new({path = self.SAMPLE_PATH}) + + self._timer = 0.0 + self._sample_played = false + return self end +function KShootManiaPage:init() + self._timer = 0.0 + self._sample_played = false + Page.init(self) +end + +function KShootManiaPage:drawBackground(deltaTime) + gfx.BeginPath() + gfx.FillColor(table.unpack(self.BACKGROUND_COLOR)) + gfx.Rect(0, 0, Dim.design.width, Dim.design.height) + gfx.Fill() +end + +function KShootManiaPage:drawContent(deltaTime) + local x = (Dim.design.width - self.logo_img.width) / 2 + local y = (Dim.design.height - self.logo_img.height) / 2 + + self.logo_img:setPosition(x, y) + + self.logo_img:render() +end + +function KShootManiaPage:render(deltaTime) + if not self._sample_played then + self.splash_sample:play() + end + + Page.render(self, deltaTime) + + if self._timer > self.TIMEOUT then + self:onInvalidation() + end + + self._timer = self._timer + deltaTime +end + return KShootManiaPage \ No newline at end of file diff --git a/scripts/titlescreen/pages/splash/teamexceedpage.lua b/scripts/titlescreen/pages/splash/teamexceedpage.lua index 9484653..b40cf8e 100644 --- a/scripts/titlescreen/pages/splash/teamexceedpage.lua +++ b/scripts/titlescreen/pages/splash/teamexceedpage.lua @@ -1,6 +1,10 @@ require "common.globals" require "common.class" +local Dim = require "common.dimensions" + +local Image = require "api.image" + local Page = require "api.page.page" local splash3BgColor = {255, 255, 255} @@ -43,8 +47,13 @@ local function splash3(deltaTime) end ---@class TeamExceedPage : Page +---@field logo_img Image +---@field _timer number local TeamExceedPage = { - + __name = "TeamExceedPage", + BACKGROUND_COLOR = {255, 255, 255}, + LOGO_PATH = "titlescreen/splash/team-exceed.png", + TIMEOUT = 3.0 } ---Create a new TeamExceedPage instance @@ -52,7 +61,42 @@ local TeamExceedPage = { function TeamExceedPage.new(params) local self = CreateInstance(TeamExceedPage, params, Page) + self.logo_img = Image.new(self.LOGO_PATH) + + self._timer = 0.0 + return self end +function TeamExceedPage:init() + self._timer = 0.0 + Page.init(self) +end + +function TeamExceedPage:drawBackground(deltaTime) + gfx.BeginPath() + gfx.FillColor(table.unpack(self.BACKGROUND_COLOR)) + gfx.Rect(0, 0, Dim.design.width, Dim.design.height) + gfx.Fill() +end + +function TeamExceedPage:drawContent(deltaTime) + local x = (Dim.design.width - self.logo_img.width) / 2 + local y = (Dim.design.height - self.logo_img.height) / 2 + + self.logo_img:setPosition(x, y) + + self.logo_img:render() +end + +function TeamExceedPage:render(deltaTime) + Page.render(self, deltaTime) + + if self._timer > self.TIMEOUT then + self:onInvalidation() + end + + self._timer = self._timer + deltaTime +end + return TeamExceedPage \ No newline at end of file diff --git a/scripts/titlescreen/pages/splash/uscpage.lua b/scripts/titlescreen/pages/splash/uscpage.lua index 58f80a7..57d89e0 100644 --- a/scripts/titlescreen/pages/splash/uscpage.lua +++ b/scripts/titlescreen/pages/splash/uscpage.lua @@ -1,50 +1,20 @@ require "common.globals" require "common.class" +local Dim = require "common.dimensions" + +local Image = require "api.image" + local Page = require "api.page.page" -local splash2BgColor = {255, 255, 255} -local splash2Logo = gfx.CreateSkinImage("titlescreen/splash/usc2.png", 0) -local splash2LogoWidth, splash2LogoHeight = gfx.ImageSize(splash2Logo) - -local function splash2(deltaTime) - local splash2LogoXOffset = (Dim.design.width - splash2LogoWidth) / 2 - local splash2LogoYOffset = (Dim.design.height - splash2LogoHeight) / 2 - - calcFade(splash2Duration) - - gfx.BeginPath() - gfx.Rect(0, 0, Dim.design.width, Dim.design.height) - gfx.FillColor(splash2BgColor[1], splash2BgColor[2], splash2BgColor[3], fadeAlpha) - gfx.Fill() - - gfx.BeginPath() - gfx.ImageRect(splash2LogoXOffset, splash2LogoYOffset, splash2LogoWidth, splash2LogoHeight, splash2Logo, fadeAlpha / 255, 0) - - gfx.BeginPath() - gfx.LoadSkinFont("segoeui.ttf") - gfx.FillColor(0, 0, 0, fadeAlpha) - gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_BOTTOM) - gfx.FontSize(28) - - gfx.Text("Press START to skip...", 10, Dim.design.height - 10) - - if (splashTimer < 0) then - splashState = "splash3" - splashTimer = 0 - return - end - - if splashTimer == 0 then - splashTimer = splash2Duration - end - - splashTimer = splashTimer - deltaTime -end - ---@class USCPage : Page +---@field logo_img Image +---@field _timer number local USCPage = { - + __name = "USCPage", + BACKGROUND_COLOR = {255, 255, 255}, + LOGO_PATH = "titlescreen/splash/usc2.png", + TIMEOUT = 3.0 } ---Create a new USCPage instance @@ -52,7 +22,42 @@ local USCPage = { function USCPage.new(params) local self = CreateInstance(USCPage, params, Page) + self.logo_img = Image.new(self.LOGO_PATH) + + self._timer = 0.0 + return self end +function USCPage:init() + self._timer = 0.0 + Page.init(self) +end + +function USCPage:drawBackground(deltaTime) + gfx.BeginPath() + gfx.FillColor(table.unpack(self.BACKGROUND_COLOR)) + gfx.Rect(0, 0, Dim.design.width, Dim.design.height) + gfx.Fill() +end + +function USCPage:drawContent(deltaTime) + local x = (Dim.design.width - self.logo_img.width) / 2 + local y = (Dim.design.height - self.logo_img.height) / 2 + + self.logo_img:setPosition(x, y) + + self.logo_img:render() +end + +function USCPage:render(deltaTime) + Page.render(self, deltaTime) + + if self._timer > self.TIMEOUT then + self:onInvalidation() + end + + self._timer = self._timer + deltaTime +end + return USCPage \ No newline at end of file diff --git a/scripts/titlescreen/service.lua b/scripts/titlescreen/service.lua index ab17703..7bf7bd6 100644 --- a/scripts/titlescreen/service.lua +++ b/scripts/titlescreen/service.lua @@ -1,60 +1,42 @@ -local Dim = require("common.dimensions") -local Wallpaper = require("components.wallpaper") +require("common.class") -local PageView = require("api.page.pageview") -local MainMenuPage = require("titlescreen.pages.service.mainmenupage") +local PageManager = require "api.page.pagemanager" ---[[ WIP: REIMPLEMENTATION +local ServicePage = require("api.page.servicepage") +local InputCheckPage = require("titlescreen.pages.service.inputcheckpage") +local ScreenCheckPage = require("titlescreen.pages.service.screencheckpage") +local ColorCheckPage = require("titlescreen.pages.service.colorcheckpage") +local VersionInfoPage = require("titlescreen.pages.service.versioninfopage") +local ServiceLinkField = require("titlescreen.components.servicelinkfield") +local ListField = require("titlescreen.components.listfield") -local rootMenu = { - {label = "IDOLS", children = {{label = "GRACEv6"}, {label = "NEARNOAHv6"}, {label = "IDKv6"}}}, - { - label = "LASER COLORS", - children = { - { - label = "LEFT LASER", - children = { - {label = "BLUE", color = {0, 128, 255}}, - {label = "PINK", color = {255, 0, 255}}, - {label = "GREEN", color = {0, 255, 0}}, - {label = "YELLOW", color = {255, 255, 0}}, - }, - }, - { - label = "RIGHT LASER", - children = {{label = "BLUE"}, {label = "PINK"}, {label = "GREEN"}, {label = "YELLOW"}}, - }, - }, - }, +---@class ServiceMenuPage: ServicePage +local ServiceMenuPage = { + __name = "ServiceMenuPage", } -]] +---Create a new MainMenuPage instance +---@param params? MainMenuPage # initial parameters +---@return MainMenuPage +function ServiceMenuPage.new(params) + params = params or {} -local currentpage = MainMenuPage.new() + params.title = params.title or "MAIN MENU" -local pageview = PageView.new(currentpage) + local self = CreateInstance(ServiceMenuPage, params, ServicePage) -local function reset() - pageview = PageView.new(currentpage) + local pageManager = PageManager.get() + local list = ListField.new() + list:addField(ServiceLinkField.new{label = "INPUT CHECK", link = pageManager:getPage(InputCheckPage)}) + list:addField(ServiceLinkField.new{label = "SCREEN CHECK", link = pageManager:getPage(ScreenCheckPage)}) + list:addField(ServiceLinkField.new{label = "COLOR CHECK", link = pageManager:getPage(ColorCheckPage)}) + list:addField(ServiceLinkField.new{label = "VERSION INFORMATION", link = pageManager:getPage(VersionInfoPage)}) + list:refreshFields() + + self:addField(list) + self:refreshFields() + + return self end -local function render(deltaTime) - Dim.updateResolution() - - Wallpaper.render() - - Dim.transformToScreenSpace() - - pageview:render(deltaTime) - - --pageview will be empty when you `back()` out of the root page - if not pageview:get() then - return {eventType = "switch", toScreen = "splash"} - end -end - -local function onButtonPressed(button) - pageview:get():handleButtonInput(button) -end - -return {reset = reset, render = render, onButtonPressed = onButtonPressed} +return ServiceMenuPage diff --git a/scripts/titlescreen/splash.lua b/scripts/titlescreen/splash.lua index b955a89..902be93 100644 --- a/scripts/titlescreen/splash.lua +++ b/scripts/titlescreen/splash.lua @@ -1,13 +1,11 @@ -local Common = require("common.util") +local Util = require("common.util") local Dim = require("common.dimensions") -local splashSample = "titlescreen/splash/splash1.wav" - -game.LoadSkinSample(splashSample) -local splash1SfxPlayed = false - require "common.globals" require "common.class" + +local PageManager = require "api.page.pagemanager" + local Page = require "api.page.page" local KShootManiaPage = require "titlescreen.pages.splash.kshootmaniapage" local USCPage = require "titlescreen.pages.splash.uscpage" @@ -18,10 +16,11 @@ local CreditsPage = require "titlescreen.pages.splash.creditspage" ---@field pages Page[] ---@field currentPage integer ---@field _isTransitioning boolean # actively fading between pages +---@field _isFadeOut boolean # fading out between pages local SplashPage = { __name = "SplashScreen", BACKGROUND_COLOR = {255, 255, 255}, - FADE_DURATION = 0.5 + FADE_DURATION = 0.25 } ---Create a new SplashScreen instance @@ -30,22 +29,24 @@ local SplashPage = { function SplashPage.new(params) local self = CreateInstance(SplashPage, params, Page) - self.currentPage = 1 + local pageManager = PageManager.get() + + self.currentPage = 0 -- start on nil page self.content = { - KShootManiaPage.new(), - USCPage.new(), - TeamExceedPage.new(), - CreditsPage.new() + pageManager:getPage(KShootManiaPage), + pageManager:getPage(USCPage), + pageManager:getPage(TeamExceedPage), + pageManager:getPage(CreditsPage), } - self._isTransitioning = false + self._isTransitioning = true -- immediately transition to first page + self._isFadeOut = false -- set callbacks for index, page in ipairs(self.content) do if index < #self.content then page.onInvalidation = function (page_inst) self._isTransitioning = true - self.currentPage = index + 1 end else -- last index page.onInvalidation = function (page_inst) @@ -57,26 +58,25 @@ function SplashPage.new(params) end function SplashPage:init() - self.currentPage = 1 - self._isTransitioning = false + self.currentPage = 0 + self._isTransitioning = true + for _, page in ipairs(self.content) do + page:init() + end Page.init(self) end function SplashPage:handleButtonInput(button) if button == game.BUTTON_STA then - game.StopSample(splashSample) + game.StopSample(KShootManiaPage.SAMPLE_PATH) -- hack to stop splash screen sample from playing when skipping self:onInvalidation() end end ---Fade between pages ----@param fadeDuration? number ----@param fadeColor? integer[] -function SplashPage:fadeTransition(deltaTime, fadeDuration, fadeColor) - fadeDuration = fadeDuration or 0.5 - fadeColor = fadeColor or {255, 255, 255} - - local fadeAlpha = 0.0 +function SplashPage:fadeTransition(deltaTime) + local fadeDuration = self.FADE_DURATION + local fadeColor = self.BACKGROUND_COLOR -- reset variables on first call if not self["__fadeStarted"] then @@ -84,14 +84,27 @@ function SplashPage:fadeTransition(deltaTime, fadeDuration, fadeColor) self.__fadeStarted = true end + local fadeAlpha = 0.0 local halfDuration = fadeDuration / 2 if self.__fadeTimer < halfDuration then - fadeAlpha = Common.lerp(self.__fadeTimer, 0, 0, halfDuration, 255) -- fade out + fadeAlpha = math.ceil(Util.lerp(self.__fadeTimer, 0, 0, halfDuration, 255)) -- fade out + + self._isFadeOut = true + elseif self.__fadeTimer < fadeDuration then - fadeAlpha = Common.lerp(self.__fadeTimer, halfDuration, 255, fadeDuration, 0) -- fade in + fadeAlpha = math.ceil(Util.lerp(self.__fadeTimer, halfDuration, 255, fadeDuration, 0)) -- fade in + + if self._isFadeOut then -- just switched to fading in, swap to new page + self.currentPage = self.currentPage + 1 + end + + self._isFadeOut = false + else self.__fadeStarted = false -- fade done, reset variable self._isTransitioning = false + self._isFadeOut = false + end local fillColor = {table.unpack(fadeColor, 1, 3)} -- copy color table @@ -113,14 +126,26 @@ function SplashPage:drawBackground(deltaTime) end function SplashPage:drawContent(deltaTime) - self.content[self.currentPage]:render(deltaTime) -end - -function SplashPage:drawForeground(deltaTime) - local fadeColor = {255, 255, 255} - if self._isTransitioning then - self:fadeTransition(deltaTime, self.FADE_DURATION, fadeColor) + if self.content[self.currentPage] then + self.content[self.currentPage]:render(deltaTime) end end +function SplashPage:drawForeground(deltaTime) + local textFillColor = {0, 0, 0} + if self.currentPage <= 1 then + textFillColor = {255, 255, 255} + end + + if self._isTransitioning then + self:fadeTransition(deltaTime) + end + + gfx.LoadSkinFont("segoeui.ttf") + gfx.FillColor(table.unpack(textFillColor)) + gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_BOTTOM) + gfx.FontSize(28) + gfx.Text("Press START to skip...", 10, Dim.design.height - 10) +end + return SplashPage diff --git a/scripts/titlescreen/title.lua b/scripts/titlescreen/title.lua index 8c27b1d..714e022 100644 --- a/scripts/titlescreen/title.lua +++ b/scripts/titlescreen/title.lua @@ -1,61 +1,54 @@ -local Version = require('common.version') -local Dim = require("common.dimensions") +require "common.globals" -local Wallpaper = require("components.wallpaper") +local Version = require "common.version" +local Dim = require "common.dimensions" -local splash1Image = gfx.CreateSkinImage('titlescreen/title/background.png', 0) +local Image = require "api.image" -local triggerModeSelect = false -local triggerServiceMenu = false +local Page = require "api.page.page" local versionString = Version.getLongVersion() -local function render(deltaTime) - Dim.updateResolution() +---@class TitlePage : Page +---@field background_img Image +local TitlePage = { + __name = "TitlePage", + BACKGROUND_IMG_PATH = "titlescreen/title/background.png", +} - Wallpaper.render() +function TitlePage.new(params) + local self = CreateInstance(TitlePage, params, Page) - Dim.transformToScreenSpace() + self.background_img = Image.new(self.BACKGROUND_IMG_PATH) + self.background_img:setPosition(0, 0) + self.background_img:setSize(Dim.design.width, Dim.design.height) - gfx.BeginPath() - gfx.ImageRect(0, 0, Dim.design.width, Dim.design.height, splash1Image, 1, 0) - - gfx.LoadSkinFont("segoeui.ttf") - gfx.FillColor(255, 255, 255, 255) - gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP) - gfx.FontSize(28) - - gfx.Text(versionString, 10, 10) - - if (triggerModeSelect) then - triggerModeSelect = false - return { - eventType = 'switch', - toScreen = 'mode_select' - } - end - - if (triggerServiceMenu) then - triggerServiceMenu = false - return { - eventType = 'switch', - toScreen = 'service' - } - end + return self end -local function onButtonPressed(button) +function TitlePage:handleButtonInput(button) if button == game.BUTTON_FXR and game.GetButton(game.BUTTON_FXL) or button == game.BUTTON_FXL and game.GetButton(game.BUTTON_FXR) then - triggerServiceMenu = true + self:onInvalidation(true) -- true to switch to service menu end if button == game.BUTTON_STA then - triggerModeSelect = true + self:onInvalidation() end end -return { - render = render, - onButtonPressed = onButtonPressed -} \ No newline at end of file +function TitlePage:drawBackground(deltaTime) + self.background_img:render() +end + +function TitlePage:drawForeground(deltaTime) + gfx.LoadSkinFont("segoeui.ttf") + gfx.FillColor(255, 255, 255) + gfx.StrokeColor(0, 0, 0) + gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP) + gfx.FontSize(28) + gfx.StrokeWidth(1) + gfx.Text(versionString, 10, 10) +end + +return TitlePage \ No newline at end of file