From 55212c14403428ac50cd5e8a8fc2d144fbb668bc Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Tue, 20 Dec 2022 23:59:35 +0100 Subject: [PATCH] #1 Rendering of level --- assets/entities/door.png | Bin 0 -> 1548 bytes assets/environment/entrance.png | Bin 0 -> 1548 bytes assets/environment/exit.png | Bin 0 -> 1548 bytes assets/environment/tile.png | Bin 0 -> 1548 bytes assets/environment/void.png | Bin 0 -> 1548 bytes assets/environment/wall.png | Bin 0 -> 1548 bytes assets/items/dagger.png | Bin 0 -> 734 bytes assets/items/key.png | Bin 0 -> 1548 bytes lib/RPGEngine/Render/Core.hs | 13 ++++++++- lib/RPGEngine/Render/Level.hs | 49 ++++++++++++++++++++++++++++++-- 10 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 assets/entities/door.png create mode 100644 assets/environment/entrance.png create mode 100644 assets/environment/exit.png create mode 100644 assets/environment/tile.png create mode 100644 assets/environment/void.png create mode 100644 assets/environment/wall.png create mode 100644 assets/items/dagger.png create mode 100644 assets/items/key.png diff --git a/assets/entities/door.png b/assets/entities/door.png new file mode 100644 index 0000000000000000000000000000000000000000..f876321bc4b4808bab5eac8ec26ee9069a17944e GIT binary patch literal 1548 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#rS!}jlHhlVqjpA_H=O!u@GbwV0r(WQB_##KTsK2;P%^Rj4Ubc+6-o5 z9AE=Zz4}2CJ8dz;e0%91C0q6y71P90hIXSzog+bQ95F)xOb`GW01ZV*%z@bj>hv3>ScGXE%>z zurp_1umd^^c}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#ke))PZx+yVqjpA_H=O!u@GbwV0r(W5vYVgRaojjh$a=>e*27(5vDo2 zu7xE1Q=4ia>Olrfm^knM+Joo+qq9ML7zW9M)PeZOY!;Zc6+zxGCYaXMP-8HcX9crQ zKKzX$2T}`jG1vfE14Fnbn9At3ei)NM1#eTU?ES6DKI_YK!lkF3nX+JWH7oIObmdKI;Vst0AJ@qssI20 literal 0 HcmV?d00001 diff --git a/assets/environment/exit.png b/assets/environment/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2a66e713055ebdaeadd847457cdd1371a18ce8 GIT binary patch literal 1548 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#kjSV7V23rGBB`6d%8G=SO_u-u)O~bRDl5d3w-~BFhT^Cg-xCXS;?ta zKajZ?Y;5vO7^+AVU{Mv80y}wDtTDqy#XtsG14D-WVs%)(@h-55;qis@KzWY;X^YQ- ztzv{3km9aQlHGH5UPUzk#M9MK0}EchaSKeN6WHWY0?}Na6>0#wRtO)PJjH=H3=Dt= sB62#IC02(u6k+LLme_iR(R6?aqFcTmH+Q6+eE|~jboFyt=akR{0PvR=CjbBd literal 0 HcmV?d00001 diff --git a/assets/environment/tile.png b/assets/environment/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..91f4b5d31886b61ce64043fc4209d9bdddb6fd3c GIT binary patch literal 1548 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#rP!*7JhA6%D})P?djqeVj;*V!1De#qnU!if1on50Sh}TH`$th{{G6q zgikj}0U?0b079BU@)Q{W@;*fd5DWuCUZB_oAPZPP&H$N2Oo(H15j-7`n;s|%M39R{ b4WL38xL*@Ec}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#kh53BRHFXGcd47d%8G=SO_u-u)P1xs46V=AE=CMz(lrAsK!wP7#K#w gU^EOs*FVdQ&MBb@0D*YVPyhe` literal 0 HcmV?d00001 diff --git a/assets/environment/wall.png b/assets/environment/wall.png new file mode 100644 index 0000000000000000000000000000000000000000..cfe91c2f7e7c0373745f8ed8a51b25a3176cc860 GIT binary patch literal 1548 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#rUNZ`bxezGcd47d%8G=SO_u-u)P1x=%erXAE*ok@N)1neE#tnECynu z1DG60oCQQENu!(bi9r-30S2F73^)ywyZ4llfe9{3CIjpOE_QY@wf|yZ`S|SOk_pf#Cp7%IKOw3SeR|8YG4cK;j@5fRi%FG+Y3m97qq?3%E2B ZBkq(J_-@vlC7@EC!PC{xWt~$(69CJfAY=dl literal 0 HcmV?d00001 diff --git a/assets/items/dagger.png b/assets/items/dagger.png new file mode 100644 index 0000000000000000000000000000000000000000..d1da3c30753e98239a7e53f8a81444a45a5c5be1 GIT binary patch literal 734 zcmV<40wMj0P)i%R0j>_=3B$BX!ZHof^^&Q0Te#QA zCRc?Ig@cw1D14=Kz0S{yGj)DfY$f6|;8s1gObhERY-Fvx@QCnWK36sx^QbTJr3&+N zQu}2OU=t@o7!92=Yvd>ql3I|={`QU5e6tkAW60a2f+da&S@8x%Elbyw)U@a+d2&=# z?!WW2)8k|H?!GXzKRM3Z5O{asyXrV!M~?G-44y~0C^Y>=$!YRK^lDQZJOKYDoLx3G zeHYHRAn;%&tz=E|$abgG@Olc}i_mieoy+yC8t0tcLt;aI(KYPt!?4`((uj4M8yg>gwtsHnKX1YAA^=LC6r~SOV)s@dC&ukd2|Cp$y30X=!Nz+4ukdMOOw8Mg}a% z94H%P2!=~G$MZ3q*>{=Y#f5JuTF_kplLWg2!~waa;`((4R literal 0 HcmV?d00001 diff --git a/assets/items/key.png b/assets/items/key.png new file mode 100644 index 0000000000000000000000000000000000000000..667429626659029db47946e6c28d7d7494682cb5 GIT binary patch literal 1548 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}+T(D5NZbEqUF*A=U0r01LezJ!=ty4cB&gLAwJ?-@^6Y&JJe?;!dZe*KOr}OB zOg3gtX=#Bd%R%;z#giv5>Yh@O7nC9Rxb^VgAMgM2KmR8#@G5m#q^zOCm41p% zm}P$9wNs(j=1ksiFy(Uiw4HvYT`Xc7Svrk^0$e#$Z**K*H#tes^?9NE|BlzwPb{6V zn#HY;HDrNf+205CAFQLb?M+{navg0vCw}~=1oN)4Mz^zt`}$><7c#NTZ`9uVbp4ga zoBo%wb#;qacygG?NMQuI$ga#rOr;Pjt|6IXF)-wsU^AD237aU)xiDuk01blydnZ*G6O#r9*40dKNFzHJCjK8N phb)e10#F2(0+2W^IjjZ^9YJS%ORlr)zb*o~*wfX|Wt~$(69BPq2de-8 literal 0 HcmV?d00001 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