Implement pause state.

This commit is contained in:
Gonzalo Delgado 2024-10-05 09:18:25 -03:00
parent ab89785883
commit bf1a3134a1
2 changed files with 90 additions and 7 deletions

View File

@ -446,6 +446,7 @@ Let's start with the base ~GameState~ class, it should keep the shared logic of
up=false, up=false,
down=false, down=false,
jump=false, jump=false,
pause_key_was_released=false,
} }
self.ended = false self.ended = false
self.next = nil self.next = nil
@ -458,6 +459,9 @@ Let's start with the base ~GameState~ class, it should keep the shared logic of
self.input.up = love.keyboard.isDown("w", "up") self.input.up = love.keyboard.isDown("w", "up")
self.input.down = love.keyboard.isDown("down", "s") self.input.down = love.keyboard.isDown("down", "s")
self.input.jump = love.keyboard.isDown("space") self.input.jump = love.keyboard.isDown("space")
if not (self.input.pause_key_was_released or self.input.start) then
self.input.pause_key_was_released = true
end
end end
function GameState:update(dt) function GameState:update(dt)
@ -548,9 +552,15 @@ Also, it'll spawn a couple entities for enemies that will just move around the s
self:updateItems(dt) self:updateItems(dt)
self:updateEnemies(dt) self:updateEnemies(dt)
self:updateChirps(dt) self:updateChirps(dt)
if self.input.pause_key_was_released and self.input.start then
self.ended = true
self.next = Pause:new(self)
self.input.pause_key_was_released = false
end
end end
function Play:draw() function Play:draw()
Play.__super.draw(self)
love.graphics.setColor(0.2, 0.2, 0.2) love.graphics.setColor(0.2, 0.2, 0.2)
self.map:draw() self.map:draw()
love.graphics.setColor(0, 0.8, 0.1) love.graphics.setColor(0, 0.8, 0.1)
@ -560,13 +570,45 @@ Also, it'll spawn a couple entities for enemies that will just move around the s
end end
end end
#+end_src #+end_src
Let's define a ~Pause~ state and see how it connects to ~Play~, it'll need to keep the ~Play~ state instance so it can be resumed after unpausing:
#+name: pauseState
#+begin_src lua :tangle no
local Pause = GameState:extend()
function Pause:init(play_state)
Pause.__super.init(self)
self.play_state = play_state
end
function Pause:update(dt)
Pause.__super.update(self, dt)
if self.input.pause_key_was_released and self.input.start then
self.input.pause_key_was_released = false
self.ended = true
self.play_state.ended = false
self.next = self.play_state
end
end
function Pause:draw()
Pause.__super.draw(self)
local pause_str = "~ PAUSE ~"
local font = love.graphics.getFont()
local height = font:getHeight()
local width = font:getWidth(pause_str)
love.graphics.setColor(1, 1, 1)
love.graphics.print(pause_str, 320/2, 200/2, 0, 2, 2, width/2, height/2)
end
#+end_src
#+begin_src lua :tangle states.lua :noweb yes #+begin_src lua :tangle states.lua :noweb yes
<<playState>> <<pauseState>>
<<titleState>> <<playState>>
return { <<titleState>>
Play=Play, return {
Title=Title, Play=Play,
} Title=Title,
}
#+end_src #+end_src
#+begin_src lua #+begin_src lua
@ -1320,8 +1362,13 @@ Need to check ~next_state.pos~ and resulting ~top_left_tile~ for this case.
y = 184 y = 184
} }
** TODO Implement game pause as ~Play~ substate ** DONE Implement game pause as ~Play~ substate
DEADLINE: <2024-09-24 mar> DEADLINE: <2024-09-24 mar>
:LOGBOOK:
CLOCK: [2024-10-02 mié 14:40]--[2024-10-02 mié 15:01] => 0:21
:END:
It's kinda working but I need to debounce it.
** TODO replace hardcoded player initial position (180, 100) with marker/point from Tiled map ** TODO replace hardcoded player initial position (180, 100) with marker/point from Tiled map

View File

@ -15,6 +15,7 @@ function GameState:init()
up=false, up=false,
down=false, down=false,
jump=false, jump=false,
pause_key_was_released=false,
} }
self.ended = false self.ended = false
self.next = nil self.next = nil
@ -27,6 +28,9 @@ function GameState:updateInput(dt)
self.input.up = love.keyboard.isDown("w", "up") self.input.up = love.keyboard.isDown("w", "up")
self.input.down = love.keyboard.isDown("down", "s") self.input.down = love.keyboard.isDown("down", "s")
self.input.jump = love.keyboard.isDown("space") self.input.jump = love.keyboard.isDown("space")
if not (self.input.pause_key_was_released or self.input.start) then
self.input.pause_key_was_released = true
end
end end
function GameState:update(dt) function GameState:update(dt)
@ -36,6 +40,32 @@ end
function GameState:draw() function GameState:draw()
end end
local Pause = GameState:extend()
function Pause:init(play_state)
Pause.__super.init(self)
self.play_state = play_state
end
function Pause:update(dt)
Pause.__super.update(self, dt)
if self.input.pause_key_was_released and self.input.start then
self.input.pause_key_was_released = false
self.ended = true
self.play_state.ended = false
self.next = self.play_state
end
end
function Pause:draw()
Pause.__super.draw(self)
local pause_str = "~ PAUSE ~"
local font = love.graphics.getFont()
local height = font:getHeight()
local width = font:getWidth(pause_str)
love.graphics.setColor(1, 1, 1)
love.graphics.print(pause_str, 320/2, 200/2, 0, 2, 2, width/2, height/2)
end
local Play = GameState:extend() local Play = GameState:extend()
function Play:init() function Play:init()
@ -83,9 +113,15 @@ function Play:update(dt)
self:updateItems(dt) self:updateItems(dt)
self:updateEnemies(dt) self:updateEnemies(dt)
self:updateChirps(dt) self:updateChirps(dt)
if self.input.pause_key_was_released and self.input.start then
self.ended = true
self.next = Pause:new(self)
self.input.pause_key_was_released = false
end
end end
function Play:draw() function Play:draw()
Play.__super.draw(self)
love.graphics.setColor(0.2, 0.2, 0.2) love.graphics.setColor(0.2, 0.2, 0.2)
self.map:draw() self.map:draw()
love.graphics.setColor(0, 0.8, 0.1) love.graphics.setColor(0, 0.8, 0.1)