diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-03-01 07:27:50 +0000 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-03-01 07:27:50 +0000 |
commit | 973961a0ced31c30f0e7e5abc618aaca6c8452b8 (patch) | |
tree | ba6d11b5a3e14e39568e3b49ec3c4550b5a825b9 /src/Game/Entities.hs | |
parent | 9efd5381a31d69a1122f101cbee03ad3a91ed4b3 (diff) | |
download | space-plat-hs-973961a0ced31c30f0e7e5abc618aaca6c8452b8.tar.gz space-plat-hs-973961a0ced31c30f0e7e5abc618aaca6c8452b8.zip |
Scroll using SDL's viewport
Horizontal needs testing.
Diffstat (limited to 'src/Game/Entities.hs')
-rw-r--r-- | src/Game/Entities.hs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/Game/Entities.hs b/src/Game/Entities.hs index 7e0e0cf..4e5a686 100644 --- a/src/Game/Entities.hs +++ b/src/Game/Entities.hs @@ -1,4 +1,4 @@ -module Game.Entities (Entities, Entity, mkEntities, updateAll, render) where +module Game.Entities (Entities, Entity, mkEntities, updateAll, render, renderVisible, playerPosition) where import Control.Monad import Data.Bits (Bits (..)) @@ -35,6 +35,13 @@ mkEntities sprites m controls stateRef = do toEntity playerRef (M.BatteryEntity x y) = mkBattery sprites x y (collision playerRef 16) (collectedBattery stateRef) toEntity _ (M.PlayerEntity _ _) = error "Player already processed" +-- | Return the player's entity position (x, y). +playerPosition :: Entities -> (Int, Int) +playerPosition (Entities _ _ _ entities) = + (player.x, player.y) + where + player = head entities + processSpawn :: S.SpriteSheet -> Spawn -> IO Entity processSpawn sprites (DustEffectSpawn x y) = mkEffect sprites x y "dust" @@ -73,6 +80,18 @@ updateAll es = do TypeEnemy -> False _ -> True +-- | Render only visible entities according to the provided viewport. +renderVisible :: SDL.Renderer -> Entities -> M.Viewport -> IO () +renderVisible renderer (Entities sprites player state entities) v = + render renderer (Entities sprites player state visible) + where + -- FIXME: entities should have size so we can be exact here and + -- avoid the hardcoded size + visible = filter (\e -> isVisible v e.x e.y 16 16) entities + isVisible :: M.Viewport -> Int -> Int -> Int -> Int -> Bool + isVisible (M.Viewport vx vy vw vh) x y w h = + x < vx + vw && vx < x + w && y < vy + vh && vy < y + h + render :: SDL.Renderer -> Entities -> IO () render renderer es = do state <- readIORef es.state |