From 2f40109ab69892c7b7812fdbba3a83dc3ca96193 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Sat, 25 Feb 2023 13:50:04 +0000 Subject: Game over sequence WIP --- src/Game.hs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 15 deletions(-) (limited to 'src/Game.hs') diff --git a/src/Game.hs b/src/Game.hs index f04acc6..4f84ad1 100644 --- a/src/Game.hs +++ b/src/Game.hs @@ -8,15 +8,16 @@ import Foreign.C.Types (CInt) import qualified Game.BitmapFont as BF import qualified Game.Controller as C import qualified Game.Entities as E +import Game.Entities.Const (gameOverDelay) import qualified Game.Hud as H import qualified Game.Map as M import qualified Game.Sprites as S import qualified Game.State as GS -import Game.Utils (isPressed) +import qualified Game.Utils as U import SDL (($=), ($~)) import qualified SDL import qualified SDL.Image -import SDL.Vect (V2 (..)) +import SDL.Vect (V2 (..), V4 (..)) name :: String name = "Haskell gamedev [Space Platformer]" @@ -87,7 +88,8 @@ main = do totalBatteries = M.totalBatteries map', lives = maxLives, totalLives = maxLives, - hitDelay = 0 + hitDelay = 0, + gameOverDelay = 0 } hud <- H.mkHud sprites state entities <- newIORef =<< E.mkEntities sprites map' controls state @@ -142,17 +144,15 @@ gameLoop = do canvas = env.canvas renderRect = env.renderRect controls = env.controls - map' = env.map - entities = env.entities - hud = env.hud + stateRef = env.state events <- map SDL.eventPayload <$> SDL.pollEvents -- F11 for fullscreen / windowed - when (fromMaybe False $ isPressed SDL.KeycodeF11 events) toggleFullscreen + when (fromMaybe False $ U.isPressed SDL.KeycodeF11 events) toggleFullscreen -- ESC or close the window to quit - let quit = fromMaybe False (isPressed SDL.KeycodeEscape events) || SDL.QuitEvent `elem` events + let quit = fromMaybe False (U.isPressed SDL.KeycodeEscape events) || SDL.QuitEvent `elem` events unless quit $ do -- update controls controls $~ flip C.update events @@ -160,14 +160,14 @@ gameLoop = do SDL.rendererRenderTarget renderer $= Just canvas SDL.clear renderer - updated <- liftIO $ E.updateAll =<< readIORef entities - entities $= updated - - -- render map and entities void $ liftIO $ do - M.render renderer map' - H.render renderer hud - E.render renderer updated + state <- readIORef stateRef + if state.lives > 0 + then playLoop env + else + if state.gameOverDelay > 0 + then fadeOutLoop env state.gameOverDelay >> stateRef $= state {GS.gameOverDelay = state.gameOverDelay - 1} + else gameOverLoop env SDL.rendererRenderTarget renderer $= Nothing SDL.clear renderer @@ -177,3 +177,45 @@ gameLoop = do SDL.present renderer gameLoop + where + playLoop :: Env -> IO () + playLoop env = do + let renderer = env.renderer + map' = env.map + entities = env.entities + hud = env.hud + + updated <- E.updateAll =<< readIORef entities + entities $= updated + + -- render map and entities + void $ do + M.render renderer map' + H.render renderer hud + E.render renderer updated + + fadeOutLoop :: Env -> Int -> IO () + fadeOutLoop env i = do + let renderer = env.renderer + map' = env.map + entities = env.entities + hud = env.hud + + -- render map and entities + -- doing a fade to black + void $ do + M.render renderer map' + H.render renderer hud + E.render renderer =<< readIORef entities + + SDL.rendererDrawBlendMode renderer $= SDL.BlendAlphaBlend + SDL.rendererDrawColor renderer $= V4 0 0 0 (fromIntegral (255 - i * (255 `div` gameOverDelay))) + SDL.fillRect renderer Nothing + + gameOverLoop :: Env -> IO () + gameOverLoop env = do + let renderer = env.renderer + sprites = env.sprites + + title <- S.get sprites "game-over" + S.render renderer title 112 80 0 0 -- cgit v1.2.3