------------------------------------------------------------------------------ -- Imports ------------------------------------------------------------------------------ local love = require 'love' local assets = require 'src.utils.asstmngr' local dialog_manager = require 'src.ui.dlgmngr' local make_class = require 'src.utils.classes' local GameState = require 'src.gstates.gstate' local Fader = require 'src.graphics.fader' local Cursor = require 'src.ui.cursor' local SoundEffect = require 'src.sound.sfx' local Sprite = require 'src.graphics.sprite' ------------------------------------------------------------------------------ -- Class definitions ------------------------------------------------------------------------------ local Menu = make_class(GameState) ------------------------------------------------------------------------------ -- Class methods ------------------------------------------------------------------------------ function Menu:_init(name, index) GameState._init(self, name, index) self.fade = Fader() -- Sprites. self.backg = Sprite('imgs/main.png') self.gamesel = Sprite('imgs/mainsel1.png') self.quitsel = Sprite('imgs/mainsel2.png') self.gameclick = Sprite('imgs/mnclck1.png') self.quitclick = Sprite('imgs/mnclck2.png') -- Create sound effects. self.splash = SoundEffect('bgm/Opening.wav') self.quit_snd = SoundEffect('snd/byebye.wav') self.click_snd = SoundEffect('snd/MouseDwn.wav') self.roll_snd = SoundEffect('snd/RollOver.wav') -- Create a mouse cursor object at the current mouse position. local mx, my = love.mouse.getPosition() self.cursor = Cursor(mx, my) -- Register all assets. assets:register(self.name, self.cursor) assets:register(self.name, self.splash) assets:register(self.name, self.quit_snd) assets:register(self.name, self.click_snd) assets:register(self.name, self.roll_snd) assets:register(self.name, self.backg) assets:register(self.name, self.gamesel) assets:register(self.name, self.quitsel) assets:register(self.name, self.gameclick) assets:register(self.name, self.quitclick) -- Attributes self.game_selected = false self.quit_selected = false self.game_clicked = false self.quit_clicked = false end function Menu:load() -- Load basic assets. self.backg:load() self.splash:load() -- Play the initial sound effect. self.splash:play() end function Menu:update(dt) if self.all_loaded then self.fade:update(dt) else local done = true assets:update(self.name) self.all_loaded = assets:done(self.name) and done end return self.next_state end function Menu:draw() if self.all_loaded then if self.game_selected and not self.game_clicked then self.gamesel:draw() elseif self.game_selected and self.game_clicked then self.gameclick:draw() elseif self.quit_selected and not self.quit_clicked then self.quitsel:draw() elseif self.quit_selected and self.quit_clicked then self.quitclick:draw() else self.backg:draw() end self.cursor:draw() self.fade:draw() else assets:draw() end end function Menu:mousemoved(x, y, dx, dy) self.cursor:mousemoved(x, y, dx, dy) if self:IsCursorInGameBtn(x, y) then if not self.game_selected then self.roll_snd:play() end self.game_selected = true else self.game_selected = false end if self:IsCursorInQuitBtn(x, y) then if not self.quit_selected then self.roll_snd:play() end self.quit_selected = true else self.quit_selected = false end end function Menu:mousepressed(x, y, btn) if self.fade.done then if self.game_selected then self.game_clicked = true self.quit_clicked = false elseif self.quit_selected then self.game_clicked = false self.quit_clicked = true else self.game_clicked = false self.quit_clicked = false end end end function Menu:mousereleased(x, y, btn) if self.fade.done then if self.game_selected and self.game_clicked then self.next_state = 2 elseif self.quit_selected and self.quit_clicked then self.next_state = -1 self.quit_snd:play() end self.game_clicked = false self.quit_clicked = false end end function Menu:unload() assets:unload(self.name) end function Menu:IsCursorInGameBtn(x, y) return x >= 224 and x <= 224 + 89 and y >= 131 and y <= 131 + 30 end function Menu:IsCursorInQuitBtn(x, y) return x >= 243 and x <= 243 + 51 and y >= 173 and y <= 173 + 24 end ------------------------------------------------------------------------------ -- Module return ------------------------------------------------------------------------------ return Menu