From 973961a0ced31c30f0e7e5abc618aaca6c8452b8 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Wed, 1 Mar 2023 07:27:50 +0000 Subject: Scroll using SDL's viewport Horizontal needs testing. --- src/Game/Entities.hs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/Game/Entities.hs') 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 -- cgit v1.2.3