more modular menu
This commit is contained in:
parent
d091f3a6bc
commit
7df0478890
6 changed files with 178 additions and 117 deletions
122
menu.lua
122
menu.lua
|
|
@ -1,114 +1,9 @@
|
||||||
require 'config'
|
require 'config'
|
||||||
require 'button'
|
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
|
-- Menu handler
|
||||||
---@class Menu
|
---@class Menu
|
||||||
|
|
@ -117,20 +12,13 @@ local backToGameButton = Button:new(
|
||||||
Menu = {
|
Menu = {
|
||||||
states = {
|
states = {
|
||||||
-- Main menu
|
-- Main menu
|
||||||
[MenuStateIndex.start] = MenuState:new({
|
[MenuStateIndex.start] = require 'menu.start',
|
||||||
startButton, exitGameButton
|
|
||||||
}),
|
|
||||||
-- Pause menu
|
-- Pause menu
|
||||||
[MenuStateIndex.pause] = MenuState:new({
|
[MenuStateIndex.pause] = require 'menu.pause',
|
||||||
backToGameButton, exitToMenuButton
|
|
||||||
}),
|
|
||||||
-- Level selector
|
-- Level selector
|
||||||
[MenuStateIndex.levels] = MenuState:new({
|
[MenuStateIndex.levels] = MenuState:new(),
|
||||||
}),
|
|
||||||
-- Level completed menu
|
-- Level completed menu
|
||||||
[MenuStateIndex.completed] = MenuState:new({
|
[MenuStateIndex.completed] = require 'menu.completed',
|
||||||
nextLevelButton, exitToMenuButton
|
|
||||||
}),
|
|
||||||
-- Empty state
|
-- Empty state
|
||||||
[MenuStateIndex.hidden] = MenuState:new()
|
[MenuStateIndex.hidden] = MenuState:new()
|
||||||
},
|
},
|
||||||
|
|
|
||||||
24
menu/common.lua
Normal file
24
menu/common.lua
Normal file
|
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
29
menu/completed.lua
Normal file
29
menu/completed.lua
Normal file
|
|
@ -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 }
|
||||||
|
)
|
||||||
27
menu/pause.lua
Normal file
27
menu/pause.lua
Normal file
|
|
@ -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 }
|
||||||
|
)
|
||||||
40
menu/start.lua
Normal file
40
menu/start.lua
Normal file
|
|
@ -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 }
|
||||||
|
)
|
||||||
53
menu/state.lua
Normal file
53
menu/state.lua
Normal file
|
|
@ -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'
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue