diff --git a/menu.lua b/menu.lua index 9a855d0..fda11e6 100644 --- a/menu.lua +++ b/menu.lua @@ -1,114 +1,9 @@ require 'config' require 'button' +require 'menu.state' --- Menu state class ----@class MenuState ----@field buttons Button[] -MenuState = { - buttons = {} -} --- Factory function ----@param buttons Button[] | nil ----@return MenuState -function MenuState:new( buttons ) - local state = { - buttons = buttons or MenuState.buttons - } - setmetatable( state, { __index = self } ) - - return state -end - --- Draw buttons -function MenuState:draw() - for _, button in ipairs(self.buttons) do - button:draw() - end -end - --- Update buttons ----@param dt number ----@param point Point ----@param pressed boolean -function MenuState:update( dt, point, pressed ) - for _, button in pairs(self.buttons) do - button:update( dt, point, pressed ) - end -end - ----@enum MenuStateIndex -MenuStateIndex = { - start = 'start', - pause = 'pause', - levels = 'levels', - hidden = 'hidden', - completed = 'completed' -} - -local buttonTopPos = Point:new( 240, 120 ) -local buttonBotPos = Point:new( 240, 240 ) -local buttonSize = Point:new( 320, 80 ) - -local startButton = Button:new( - buttonTopPos, - buttonSize, - 'Start', - nil, - nil, - function() - Menu.current_state = MenuStateIndex.hidden - GameGrid = LevelHandler:first() - Menu.updateCellSize() - end -) - -local exitToMenuButton = Button:new( - buttonBotPos, - buttonSize, - 'Return to menu', - nil, - nil, - function() - Menu.current_state = MenuStateIndex.start - end -) - -local exitGameButton = Button:new( - buttonBotPos, - buttonSize, - 'Exit', - nil, - nil, - function() - love.event.quit() - end -) - -local nextLevelButton = Button:new( - buttonTopPos, - buttonSize, - 'Next level', - nil, - nil, - function() - GameGrid = LevelHandler:next() - Menu.updateCellSize() - Menu.current_state = MenuStateIndex.hidden - end -) - -local backToGameButton = Button:new( - buttonTopPos, - buttonSize, - 'Continue', - nil, - nil, - function() - Menu.current_state = MenuStateIndex.hidden - end -) -- Menu handler ---@class Menu @@ -117,20 +12,13 @@ local backToGameButton = Button:new( Menu = { states = { -- Main menu - [MenuStateIndex.start] = MenuState:new({ - startButton, exitGameButton - }), + [MenuStateIndex.start] = require 'menu.start', -- Pause menu - [MenuStateIndex.pause] = MenuState:new({ - backToGameButton, exitToMenuButton - }), + [MenuStateIndex.pause] = require 'menu.pause', -- Level selector - [MenuStateIndex.levels] = MenuState:new({ - }), + [MenuStateIndex.levels] = MenuState:new(), -- Level completed menu - [MenuStateIndex.completed] = MenuState:new({ - nextLevelButton, exitToMenuButton - }), + [MenuStateIndex.completed] = require 'menu.completed', -- Empty state [MenuStateIndex.hidden] = MenuState:new() }, diff --git a/menu/common.lua b/menu/common.lua new file mode 100644 index 0000000..0c51db6 --- /dev/null +++ b/menu/common.lua @@ -0,0 +1,24 @@ +require 'point' +require 'button' + +local buttonTopPos = Point:new( 240, 160 ) +local buttonBotPos = Point:new( 240, 280 ) +local buttonSize = Point:new( 320, 80 ) +local titlePos = Point:new( 240, 80 ) + +return { + buttonTopPos = buttonTopPos, + buttonBotPos = buttonBotPos, + buttonSize = buttonSize, + titlePos = titlePos, + exitToMenuButton = Button:new( + buttonBotPos, + buttonSize, + 'Return to menu', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.start + end + ) +} diff --git a/menu/completed.lua b/menu/completed.lua new file mode 100644 index 0000000..dab5c85 --- /dev/null +++ b/menu/completed.lua @@ -0,0 +1,29 @@ +require 'menu.state' +require 'button' +require 'text' + +local common = require 'menu.common' + +local nextLevelButton = Button:new( + common.buttonTopPos, + common.buttonSize, + 'Next level', + nil, + nil, + function() + GameGrid = LevelHandler:next() + Menu.updateCellSize() + Menu.current_state = MenuStateIndex.hidden + end +) + +local title = Text:new( + common.titlePos, + common.buttonSize, + 'Level completed!' +) + +return MenuState:new( + { nextLevelButton, common.exitToMenuButton }, + { title } +) diff --git a/menu/pause.lua b/menu/pause.lua new file mode 100644 index 0000000..2e45cd7 --- /dev/null +++ b/menu/pause.lua @@ -0,0 +1,27 @@ +require 'menu.state' +require 'button' +require 'text' + +local common = require 'menu.common' + +local backToGameButton = Button:new( + common.buttonTopPos, + common.buttonSize, + 'Continue', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.hidden + end +) + +local title = Text:new( + common.titlePos, + common.buttonSize, + 'Paused' +) + +return MenuState:new( + { backToGameButton, common.exitToMenuButton }, + { title } +) diff --git a/menu/start.lua b/menu/start.lua new file mode 100644 index 0000000..d4a04d1 --- /dev/null +++ b/menu/start.lua @@ -0,0 +1,40 @@ +require 'menu.state' +require 'button' +require 'text' + +local common = require 'menu.common' + +local startButton = Button:new( + common.buttonTopPos, + common.buttonSize, + 'Start', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.hidden + GameGrid = LevelHandler:first() + Menu.updateCellSize() + end +) + +local exitGameButton = Button:new( + common.buttonBotPos, + common.buttonSize, + 'Exit', + nil, + nil, + function() + love.event.quit() + end +) + +local title = Text:new( + common.titlePos, + common.buttonSize, + 'Lines' +) + +return MenuState:new( + { startButton, exitGameButton }, + { title } +) diff --git a/menu/state.lua b/menu/state.lua new file mode 100644 index 0000000..7bed4b5 --- /dev/null +++ b/menu/state.lua @@ -0,0 +1,53 @@ +-- Menu state class +---@class MenuState +---@field buttons Button[] +---@field text Text[] +MenuState = { + buttons = {}, + text = {} +} + +-- Factory function +---@param buttons Button[] | nil +---@param text Text[] | nil +---@return MenuState +function MenuState:new( buttons, text ) + local state = { + buttons = buttons or MenuState.buttons, + text = text or MenuState.text + } + + setmetatable( state, { __index = self } ) + + return state +end + +-- Draw buttons +function MenuState:draw() + for _, button in ipairs(self.buttons) do + button:draw() + end + for _, txt in ipairs(self.text) do + txt:draw() + end +end + +-- Update buttons +---@param dt number +---@param point Point +---@param pressed boolean +function MenuState:update( dt, point, pressed ) + for _, button in pairs(self.buttons) do + button:update( dt, point, pressed ) + end +end + +---@enum MenuStateIndex +MenuStateIndex = { + start = 'start', + pause = 'pause', + levels = 'levels', + hidden = 'hidden', + completed = 'completed' +} +