From 6e48bd38850f6326fe435ff87af3ca14e6707379 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Thu, 9 Feb 2023 23:25:05 +0000 Subject: Spawn objects For now only the Player. --- data/map.json | 6 +++--- src/Game.hs | 11 +++++++++-- src/Game/Entities.hs | 6 +++--- src/Game/Map.hs | 7 +++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/data/map.json b/data/map.json index b04801b..0791988 100644 --- a/data/map.json +++ b/data/map.json @@ -51,8 +51,8 @@ "type":"", "visible":true, "width":16, - "x":120, - "y":136 + "x":80, + "y":40 }], "opacity":1, "type":"objectgroup", @@ -61,7 +61,7 @@ "y":0 }], "nextlayerid":6, - "nextobjectid":2, + "nextobjectid":3, "orientation":"orthogonal", "renderorder":"right-down", "tiledversion":"1.7.2", diff --git a/src/Game.hs b/src/Game.hs index 463ef27..8cdd45f 100644 --- a/src/Game.hs +++ b/src/Game.hs @@ -45,6 +45,13 @@ data Env = Env defaultRenderRect :: SDL.Rectangle CInt defaultRenderRect = SDL.Rectangle (SDL.P $ V2 0 0) (V2 windowWidth windowHeight) +spawn :: M.Map -> S.SpriteSheet -> IORef C.Controls -> IO [E.Entity] +spawn m sprites controls = + traverse toEntity $ M.objects m + where + toEntity :: M.MapObject -> IO E.Entity + toEntity (M.PlayerEntity x y) = E.mkPlayer sprites x y controls (M.isBlocked m) + main :: IO () main = do SDL.initialize [SDL.InitVideo, SDL.InitGameController] @@ -70,8 +77,8 @@ main = do map' <- M.load "data/map.json" tsTexture sprites <- S.load "data/sprites.json" ssTexture entities <- newIORef $ E.mkEntities sprites - player <- E.mkPlayer sprites 32 104 controls (M.isBlocked map') - entities $~ E.append player + spawned <- spawn map' sprites controls + entities $~ flip E.add spawned runReaderT gameLoop Env diff --git a/src/Game/Entities.hs b/src/Game/Entities.hs index 96cc4fa..7d29e41 100644 --- a/src/Game/Entities.hs +++ b/src/Game/Entities.hs @@ -1,4 +1,4 @@ -module Game.Entities (Entities, mkEntities, mkPlayer, mkEffect, append, updateAll, render) where +module Game.Entities (Entities, Entity, mkEntities, mkPlayer, mkEffect, add, updateAll, render) where import Data.Foldable (traverse_) import Data.IORef @@ -59,8 +59,8 @@ data Entity = Entity mkEntities :: S.SpriteSheet -> Entities mkEntities sprites = Entities sprites [] -append :: Entity -> Entities -> Entities -append e (Entities sprites entities) = Entities sprites (entities ++ [e]) +add :: Entities -> [Entity] -> Entities +add (Entities sprites entities) es = Entities sprites (entities ++ es) processSpawn :: S.SpriteSheet -> Spawn -> IO Entity processSpawn sprites (DustEffectSpawn x y) = mkEffect sprites x y "dust" diff --git a/src/Game/Map.hs b/src/Game/Map.hs index a1c7e84..b4d848e 100644 --- a/src/Game/Map.hs +++ b/src/Game/Map.hs @@ -1,5 +1,7 @@ module Game.Map ( Map, + MapObject (..), + objects, load, render, isBlocked, @@ -28,6 +30,7 @@ data Layer {name :: String, objects :: [MapObject]} deriving (Show) +-- | The object types in the map. data MapObject = PlayerEntity Int Int deriving (Show) data JsonMapData = JsonMapData @@ -130,6 +133,10 @@ isBlocked :: Map -> Int -> Int -> Bool isBlocked (Map (MapData mapWidth _ ts _ blocked _) _) x y = blocked !! ((x `div` ts.width) + (y `div` ts.height) * mapWidth) >= ts.firstGid +-- | Returns the objects in the map. +objects :: Map -> [MapObject] +objects (Map md _) = md.objects + -- | Renders a map. render :: SDL.Renderer -> Map -> IO () render renderer (Map mapData tex) = do -- cgit v1.2.3