added menu handler
This commit is contained in:
parent
f82e12cfa0
commit
d7dcda1ada
3 changed files with 150 additions and 25 deletions
123
menu.lua
Normal file
123
menu.lua
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
require 'config'
|
||||
require 'button'
|
||||
|
||||
-- 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'
|
||||
}
|
||||
|
||||
local startButton = Button:new(
|
||||
Point:new( 240, 120 ),
|
||||
Point:new( 320, 80 ),
|
||||
nil,
|
||||
nil,
|
||||
function()
|
||||
Menu.current_state = MenuStateIndex.hidden
|
||||
GameGrid = LevelHandler:first()
|
||||
Menu.updateCellSize()
|
||||
end
|
||||
)
|
||||
|
||||
local exitToMenuButton = Button:new(
|
||||
Point:new( 240, 200 ),
|
||||
Point:new( 320, 80 ),
|
||||
nil,
|
||||
nil,
|
||||
function()
|
||||
Menu.current_state = MenuStateIndex.start
|
||||
end
|
||||
)
|
||||
|
||||
local exitGameButton = Button:new(
|
||||
Point:new( 240, 240 ),
|
||||
Point:new( 320, 80 ),
|
||||
nil,
|
||||
nil,
|
||||
function()
|
||||
love.event.quit()
|
||||
end
|
||||
)
|
||||
|
||||
-- Menu handler
|
||||
---@class Menu
|
||||
---@field states MenuState[]
|
||||
---@field current_state MenuStateIndex
|
||||
Menu = {
|
||||
states = {
|
||||
-- Main menu
|
||||
[MenuStateIndex.start] = MenuState:new({
|
||||
startButton, exitGameButton
|
||||
}),
|
||||
-- Pause menu
|
||||
[MenuStateIndex.pause] = MenuState:new({
|
||||
exitToMenuButton
|
||||
}),
|
||||
-- Level selector
|
||||
[MenuStateIndex.levels] = MenuState:new({
|
||||
}),
|
||||
-- Empty state
|
||||
[MenuStateIndex.hidden] = MenuState:new()
|
||||
},
|
||||
current_state = MenuStateIndex.start
|
||||
}
|
||||
|
||||
-- Draw current state
|
||||
function Menu:draw()
|
||||
self.states[self.current_state]:draw()
|
||||
end
|
||||
|
||||
-- Update current state
|
||||
---@param dt number
|
||||
---@param point Point
|
||||
---@param pressed boolean
|
||||
function Menu:update( dt, point, pressed )
|
||||
self.states[self.current_state]:update( dt, point, pressed )
|
||||
end
|
||||
|
||||
function Menu.updateCellSize()
|
||||
local width, height = love.graphics.getDimensions()
|
||||
local gridX, gridY = GameGrid.size:coords();
|
||||
local isWidthBased = (width / height) / (gridX / gridY)
|
||||
Config.cellSize = math.floor(isWidthBased and height / gridY or width / gridX)
|
||||
love.graphics.setLineWidth( Config.cellSize * Config.lineWidth )
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue