Added options menu and menu transitions.

This commit is contained in:
2025-10-06 01:07:33 -04:00
parent 719a9cd0f6
commit 9561db2847
9 changed files with 253 additions and 51 deletions

View File

@@ -5,82 +5,101 @@
local love = require 'love'
local assets = require 'src.utils.asstmngr'
local make_class = require 'src.utils.classes'
local constants = require 'src.gstates.menus.const'
local GameState = require 'src.gstates.gstate'
local MainMenu = require 'src.gstates.menus.mainmenu'
local OptionsMenu = require 'src.gstates.menus.options'
local Fader = require 'src.graphics.fader'
local Sprite = require 'src.graphics.sprite'
local Cursor = require 'src.ui.cursor'
local Font = require 'src.ui.font'
local SoundEffect = require 'src.sound.sfx'
local VBox = require 'src.ui.vbox'
local Color = require 'src.utils.color'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local MainMenu = make_class(GameState)
local Menu = make_class(GameState)
------------------------------------------------------------------------------
-- Class methods
-- Class methods
------------------------------------------------------------------------------
function MainMenu:_init(name, index)
function Menu:_init(name, index)
GameState._init(self, name, index)
self.next_state = self.index
self.fade = Fader()
self.fade = Fader()
self.current_menu = constants.MAIN_MENU
self.next_menu = constants.MAIN_MENU
self.all_loaded = false
-- Create sprites and buttons.
self.background = Sprite('imgs/concb03.png')
self.btn_font = Font('fonts/Concrete.ttf')
self.title_font = Font('fonts/BBrick.ttf', 35)
-- Create UI elements.
self.btns = VBox(15, 5, love.graphics.getWidth())
self.btns:add_label('LoveDOS', self.title_font, Color(215, 0, 0), true)
self.btns:add_text_button('New Game', self.btn_font)
self.btns:add_text_button('Load Game', self.btn_font)
self.btns:add_text_button('Options', self.btn_font)
self.btns:add_text_button('Help & Story', self.btn_font)
self.btns:add_text_button('Quit', self.btn_font, function() self.next_state = -1 end)
-- Create a mouse cursor object at the current mouse position.
local mx, my = love.mouse.getPosition()
self.cursor = Cursor(mx, my)
self.cursor = Cursor(mx, my)
-- Create sound effects.
self.bgm = SoundEffect('bgm/eskisky.wav')
-- Create the sub-menus.
self.menus = { }
self.menus[constants.MAIN_MENU] = MainMenu(self, self.title_font, self.btn_font)
self.menus[constants.OPTIONS_MENU] = OptionsMenu(self, self.title_font, self.btn_font)
-- Register all assets.
assets:register(self.name, self.btn_font)
assets:register(self.name, self.title_font)
assets:register(self.name, self.background)
assets:register(self.name, self.cursor)
assets:register(self.name, self.bgm)
assets:register(self.name, self.btns)
end
function MainMenu:update(dt)
if assets:done(self.name) then
if not self.bgm:isPlaying() then self.bgm:play() end
function Menu:update(dt)
if not self.bgm:isPlaying() then self.bgm:play() end
if self.all_loaded then
self.menus[self.current_menu]:update(dt)
-- If the game state changed then trigger a fade out.
if self.next_menu ~= self.current_menu and self.fade.done then
self.fade:fade_out()
end
-- Update the fader.
self.fade:update(dt)
-- Update the game state.
if self.menus[self.next_menu] == nil then
error(string.format('%s: switched to unknown menu', self.next_menu))
else
-- If the new state exists then unload it's data and set the new state.
if self.next_menu ~= self.current_menu and self.fade.done then
self.current_menu = self.next_menu
self.fade:fade_in()
end
end
else
local done = true
assets:update(self.name)
for _, v in pairs(self.menus) do
assets:update(v.name)
done = done and assets:done(v.name)
end
self.all_loaded = assets:done(self.name) and done
end
return self.next_state
end
function MainMenu:draw()
if assets:done(self.name) then
self.background:draw()
self.btns:draw()
function Menu:draw()
if self.all_loaded then
self.menus[self.current_menu]:draw()
self.cursor:draw()
self.fade:draw()
else
@@ -89,23 +108,23 @@ function MainMenu:draw()
end
function MainMenu:keypressed(_)
end
function MainMenu:mousemoved(x, y, dx, dy)
self.btns:mousemoved(x, y, dx, dy)
function Menu:mousemoved(x, y, dx, dy)
self.menus[self.current_menu]:mousemoved(x, y, dx, dy)
self.cursor:mousemoved(x, y, dx, dy)
end
function MainMenu:mousepressed(x, y, btn)
self.btns:mousepressed(x, y, btn)
function Menu:mousepressed(x, y, btn)
if self.fade.done then
self.menus[self.current_menu]:mousepressed(x, y, btn)
end
end
function MainMenu:mousereleased(x, y, btn)
self.btns:mousereleased(x, y, btn)
function Menu:mousereleased(x, y, btn)
if self.fade.done then
self.menus[self.current_menu]:mousereleased(x, y, btn)
end
end
@@ -113,4 +132,4 @@ end
-- Module return
------------------------------------------------------------------------------
return MainMenu
return Menu