diff --git a/assets/entities/door.png b/assets/entities/door.png new file mode 100644 index 0000000..f876321 Binary files /dev/null and b/assets/entities/door.png differ diff --git a/assets/environment/entrance.png b/assets/environment/entrance.png new file mode 100644 index 0000000..edb422f Binary files /dev/null and b/assets/environment/entrance.png differ diff --git a/assets/environment/exit.png b/assets/environment/exit.png new file mode 100644 index 0000000..2d2a66e Binary files /dev/null and b/assets/environment/exit.png differ diff --git a/assets/environment/tile.png b/assets/environment/tile.png new file mode 100644 index 0000000..91f4b5d Binary files /dev/null and b/assets/environment/tile.png differ diff --git a/assets/environment/void.png b/assets/environment/void.png new file mode 100644 index 0000000..be70f44 Binary files /dev/null and b/assets/environment/void.png differ diff --git a/assets/environment/wall.png b/assets/environment/wall.png new file mode 100644 index 0000000..cfe91c2 Binary files /dev/null and b/assets/environment/wall.png differ diff --git a/assets/items/dagger.png b/assets/items/dagger.png new file mode 100644 index 0000000..d1da3c3 Binary files /dev/null and b/assets/items/dagger.png differ diff --git a/assets/items/key.png b/assets/items/key.png new file mode 100644 index 0000000..6674296 Binary files /dev/null and b/assets/items/key.png differ diff --git a/lib/RPGEngine/Render/Core.hs b/lib/RPGEngine/Render/Core.hs index 0fe63ab..0e51063 100644 --- a/lib/RPGEngine/Render/Core.hs +++ b/lib/RPGEngine/Render/Core.hs @@ -5,6 +5,7 @@ import GHC.IO (unsafePerformIO) import Graphics.Gloss.Juicy (loadJuicyPNG) import Data.Maybe (fromJust) import Graphics.Gloss.Data.Picture (scale) +import Graphics.Gloss.Data.Bitmap (BitmapData(..)) ----------------------------- Constants ------------------------------ @@ -28,6 +29,15 @@ allEntities = [ ("door", "door.png") ] +allEnvironment :: [(String, FilePath)] +allEnvironment = [ + ("void", "void.png"), + ("tile", "tile.png"), + ("wall", "wall.png"), + ("entrance", "entrance.png"), + ("exit", "exit.png") + ] + allItems :: [(String, FilePath)] allItems = [ ("dagger", "dagger.png"), @@ -39,7 +49,7 @@ library :: [(String, Picture)] library = unknown:entities ++ environment ++ gui ++ items where unknown = ("unkown", renderPNG (assetsFolder ++ unknownImage)) entities = map (\(f, s) -> (f, renderPNG (assetsFolder ++ "entities/" ++ s))) allEntities - environment = [] + environment = map (\(f, s) -> (f, renderPNG (assetsFolder ++ "environment/" ++ s))) allEnvironment gui = [] items = map (\(f, s) -> (f, renderPNG (assetsFolder ++ "items/" ++ s))) allItems @@ -57,6 +67,7 @@ getRender id = get filtered get [] = snd $ head library get ((_, res):_) = res +-- Move a picture by game coordinates setRenderPos :: Int -> Int -> Picture -> Picture setRenderPos x y = translate floatX floatY where floatX = fromIntegral x * zoom * resolution diff --git a/lib/RPGEngine/Render/Level.hs b/lib/RPGEngine/Render/Level.hs index 267316c..4e01968 100644 --- a/lib/RPGEngine/Render/Level.hs +++ b/lib/RPGEngine/Render/Level.hs @@ -1,10 +1,53 @@ -module RPGEngine.Render.Level +module RPGEngine.Render.Level ( renderLevel ) where import Graphics.Gloss import RPGEngine.Data +import RPGEngine.Render.Core (getRender, setRenderPos, zoom, resolution) --- TODO renderLevel :: Level -> Picture -renderLevel _ = text "Level" \ No newline at end of file +renderLevel Level{ layout = l, items = i, entities = e } = level + where level = pictures [void, layout, items, entities] + void = createVoid + layout = renderLayout l + items = renderItems i + entities = renderEntities e + +renderLayout :: Layout -> Picture +renderLayout strips = pictures [setRenderPos 0 y (renderStrip (strips !! y)) | y <- [0 .. count]] + where count = length strips - 1 + +renderStrip :: [Physical] -> Picture +renderStrip list = pictures physicals + where physicals = [setRenderPos x 0 (image (list !! x)) | x <- [0 .. count]] + image Void = getRender "void" + image Walkable = getRender "tile" + image Blocked = getRender "wall" + image Entrance = pictures [getRender "tile", getRender "entrance"] + image Exit = pictures [getRender "tile", getRender "exit"] + count = length list - 1 + +renderItems :: [Item] -> Picture +renderItems list = pictures $ map renderItem list + +renderItem :: Item -> Picture +renderItem Item{ itemId = id, itemX = x, itemY = y} = setRenderPos x y image + where image = getRender id + +renderEntities :: [Entity] -> Picture +renderEntities list = pictures $ map renderEntity list + +renderEntity :: Entity -> Picture +renderEntity Entity{ entityId = id, entityX = x, entityY = y} = setRenderPos x y image + where image = getRender id + +createVoid :: Picture +createVoid = setRenderPos offX offY $ pictures voids + where voids = [setRenderPos x y void | x <- [0 .. width], y <- [0 .. height]] + void = getRender "void" + intZoom = round zoom :: Int + height = round $ 4320 / resolution / zoom + width = round $ 7680 / resolution / zoom + offX = negate (width `div` 2) + offY = negate (height `div` 2) \ No newline at end of file