93 lines
2.4 KiB
Lua
93 lines
2.4 KiB
Lua
--[[
|
|
Menu State - Example menu screen
|
|
Demonstrates:
|
|
- GameState usage
|
|
- Simple UI with keyboard navigation
|
|
]]
|
|
|
|
local Object = require("lib.classic")
|
|
local MenuState = Object:extend()
|
|
|
|
function MenuState:new()
|
|
self.options = {"Start Game", "Options", "Exit"}
|
|
self.selected = 1
|
|
self.title = "MY AWESOME GAME"
|
|
self.font = nil
|
|
end
|
|
|
|
function MenuState:enter(previous)
|
|
print("Entered menu state")
|
|
-- Load menu assets here if needed
|
|
end
|
|
|
|
function MenuState:update(dt)
|
|
-- Navigate menu
|
|
if RL.IsKeyPressed(RL.KEY_DOWN) or RL.IsKeyPressed(RL.KEY_S) then
|
|
self.selected = self.selected + 1
|
|
if self.selected > #self.options then
|
|
self.selected = 1
|
|
end
|
|
end
|
|
|
|
if RL.IsKeyPressed(RL.KEY_UP) or RL.IsKeyPressed(RL.KEY_W) then
|
|
self.selected = self.selected - 1
|
|
if self.selected < 1 then
|
|
self.selected = #self.options
|
|
end
|
|
end
|
|
|
|
-- Select option
|
|
if RL.IsKeyPressed(RL.KEY_ENTER) or RL.IsKeyPressed(RL.KEY_SPACE) then
|
|
if self.selected == 1 then
|
|
-- Switch to game state
|
|
local GameState = require("lib.gamestate")
|
|
local game = require("states.game")
|
|
GameState.switch(game)
|
|
elseif self.selected == 2 then
|
|
-- Options (not implemented)
|
|
print("Options selected")
|
|
elseif self.selected == 3 then
|
|
-- Exit
|
|
RL.CloseWindow()
|
|
end
|
|
end
|
|
end
|
|
|
|
function MenuState:draw()
|
|
local screenSize = RL.GetScreenSize()
|
|
local centerX = screenSize[1] / 2
|
|
local centerY = screenSize[2] / 2
|
|
|
|
RL.ClearBackground(RL.BLACK)
|
|
|
|
-- Draw title
|
|
local titleSize = 40
|
|
local titleText = self.title
|
|
local titleWidth = RL.MeasureText(titleText, titleSize)
|
|
RL.DrawText(titleText, {centerX - titleWidth / 2, centerY - 100}, titleSize, RL.WHITE)
|
|
|
|
-- Draw menu options
|
|
local optionSize = 24
|
|
local startY = centerY
|
|
for i, option in ipairs(self.options) do
|
|
local color = (i == self.selected) and RL.YELLOW or RL.GRAY
|
|
local prefix = (i == self.selected) and "> " or " "
|
|
local text = prefix .. option
|
|
local width = RL.MeasureText(text, optionSize)
|
|
RL.DrawText(text, {centerX - width / 2, startY + (i - 1) * 40}, optionSize, color)
|
|
end
|
|
|
|
-- Draw controls hint
|
|
local hint = "UP/DOWN: Navigate | ENTER: Select"
|
|
local hintSize = 16
|
|
local hintWidth = RL.MeasureText(hint, hintSize)
|
|
RL.DrawText(hint, {centerX - hintWidth / 2, screenSize[2] - 40}, hintSize, RL.DARKGRAY)
|
|
end
|
|
|
|
function MenuState:leave()
|
|
print("Left menu state")
|
|
-- Cleanup menu assets here if needed
|
|
end
|
|
|
|
return MenuState
|