aboutsummaryrefslogtreecommitdiff
path: root/src/Game/Entities.hs
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-03-01 07:27:50 +0000
committerJuan J. Martinez <jjm@usebox.net>2023-03-01 07:27:50 +0000
commit973961a0ced31c30f0e7e5abc618aaca6c8452b8 (patch)
treeba6d11b5a3e14e39568e3b49ec3c4550b5a825b9 /src/Game/Entities.hs
parent9efd5381a31d69a1122f101cbee03ad3a91ed4b3 (diff)
downloadspace-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.hs21
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