From fb4bc5bb36cfaf78c5fd619dde6f408edfbaa4b9 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Tue, 20 Dec 2022 22:52:06 +0100 Subject: [PATCH] #3 #2 Player render and movement --- assets/entities/player.png | Bin 0 -> 1548 bytes assets/unkown.png | Bin 0 -> 870 bytes lib/RPGEngine/Data.hs | 9 +++-- lib/RPGEngine/Data/Defaults.hs | 10 +++--- lib/RPGEngine/Input.hs | 15 +++++++- lib/RPGEngine/Input/Player.hs | 19 ++++++++++ lib/RPGEngine/Render.hs | 15 ++++++-- lib/RPGEngine/Render/Core.hs | 63 +++++++++++++++++++++++++++++++++ lib/RPGEngine/Render/GUI.hs | 10 ++++++ lib/RPGEngine/Render/Level.hs | 10 ++++++ lib/RPGEngine/Render/Player.hs | 11 ++++++ rpg-engine.cabal | 5 +++ 12 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 assets/entities/player.png create mode 100644 assets/unkown.png create mode 100644 lib/RPGEngine/Input/Player.hs create mode 100644 lib/RPGEngine/Render/Core.hs create mode 100644 lib/RPGEngine/Render/GUI.hs create mode 100644 lib/RPGEngine/Render/Level.hs create mode 100644 lib/RPGEngine/Render/Player.hs diff --git a/assets/entities/player.png b/assets/entities/player.png new file mode 100644 index 0000000000000000000000000000000000000000..512b550531a4c32d733baebadb7e7f63c18d5e21 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#rU~}M5|gZGcd47d%8G=SO_u-u)P1x2vmX4}t^>p=fS?83{ F1OUsVNech~ literal 0 HcmV?d00001 diff --git a/assets/unkown.png b/assets/unkown.png new file mode 100644 index 0000000000000000000000000000000000000000..005de405e5848326d1858dc30647bb1e0114870e GIT binary patch literal 870 zcmV-s1DX7ZP)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` game{ state = Pause }) + -- Pause the game + handleKey (Char 'p') (\game -> game{ state = Pause }), + + -- Player movement + handleKey (SpecialKey KeyUp) $ movePlayer North, + handleKey (SpecialKey KeyRight) $ movePlayer East, + handleKey (SpecialKey KeyDown) $ movePlayer South, + handleKey (SpecialKey KeyLeft) $ movePlayer West, + + handleKey (Char 'w') $ movePlayer North, + handleKey (Char 'd') $ movePlayer East, + handleKey (Char 's') $ movePlayer South, + handleKey (Char 'a') $ movePlayer West ] -- Go to the next stage of the Game diff --git a/lib/RPGEngine/Input/Player.hs b/lib/RPGEngine/Input/Player.hs new file mode 100644 index 0000000..3b77917 --- /dev/null +++ b/lib/RPGEngine/Input/Player.hs @@ -0,0 +1,19 @@ +module RPGEngine.Input.Player +( movePlayer +) where + +import RPGEngine.Data (Game(..), Direction(..), Player(..), X, Y) + +movePlayer :: Direction -> Game -> Game +movePlayer dir g@Game{ player = p@Player{ coord = (x, y) }} = newGame + where newGame = g{ player = newPlayer } + newPlayer = p{ coord = newCoord } + newCoord = (x + xD, y + yD) + (xD, yD) = diffs dir + +diffs :: Direction -> (X, Y) +diffs North = (0, 1) +diffs East = (1, 0) +diffs South = (0, -1) +diffs West = (-1, 0) +diffs Center = (0, 0) diff --git a/lib/RPGEngine/Render.hs b/lib/RPGEngine/Render.hs index 03e7855..1468f77 100644 --- a/lib/RPGEngine/Render.hs +++ b/lib/RPGEngine/Render.hs @@ -8,7 +8,15 @@ module RPGEngine.Render ) where import RPGEngine.Data + ( State(..), + Game(..) ) +import RPGEngine.Render.Level + ( renderLevel ) + import Graphics.Gloss + ( white, pictures, text, Display(InWindow), Color, Picture ) +import RPGEngine.Render.Player (renderPlayer) +import RPGEngine.Render.GUI (renderGUI) ----------------------------- Constants ------------------------------ @@ -36,9 +44,12 @@ render g@Game{ state = Lose } = renderLose g renderMenu :: Game -> Picture renderMenu _ = text "[Press any key to start]" --- TODO renderPlaying :: Game -> Picture -renderPlaying _ = text "Playing" +renderPlaying g@Game{ playing = lvl, player = player } = pictures [ + renderLevel lvl, + renderPlayer player, + renderGUI g + ] -- TODO renderPause :: Game -> Picture diff --git a/lib/RPGEngine/Render/Core.hs b/lib/RPGEngine/Render/Core.hs new file mode 100644 index 0000000..0fe63ab --- /dev/null +++ b/lib/RPGEngine/Render/Core.hs @@ -0,0 +1,63 @@ +module RPGEngine.Render.Core where + +import Graphics.Gloss ( Picture, translate ) +import GHC.IO (unsafePerformIO) +import Graphics.Gloss.Juicy (loadJuicyPNG) +import Data.Maybe (fromJust) +import Graphics.Gloss.Data.Picture (scale) + +----------------------------- Constants ------------------------------ + +-- Default scale +zoom :: Float +zoom = 5.0 + +-- Resolution of the texture +resolution :: Float +resolution = 16 + +assetsFolder :: FilePath +assetsFolder = "assets/" + +unknownImage :: FilePath +unknownImage = "unkown.png" + +allEntities :: [(String, FilePath)] +allEntities = [ + ("player", "player.png"), + ("door", "door.png") + ] + +allItems :: [(String, FilePath)] +allItems = [ + ("dagger", "dagger.png"), + ("key", "key.png" ) + ] + +-- Map of all renders +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 = [] + gui = [] + items = map (\(f, s) -> (f, renderPNG (assetsFolder ++ "items/" ++ s))) allItems + +---------------------------------------------------------------------- + +-- Turn a path to a .png file into a Picture. +renderPNG :: FilePath -> Picture +renderPNG path = scale zoom zoom $ fromJust $ unsafePerformIO $ loadJuicyPNG path + +-- Retrieve an image from the library. If the library does not contain +-- the requested image, a default is returned. +getRender :: String -> Picture +getRender id = get filtered + where filtered = filter ((== id) . fst) library + get [] = snd $ head library + get ((_, res):_) = res + +setRenderPos :: Int -> Int -> Picture -> Picture +setRenderPos x y = translate floatX floatY + where floatX = fromIntegral x * zoom * resolution + floatY = fromIntegral y * zoom * resolution \ No newline at end of file diff --git a/lib/RPGEngine/Render/GUI.hs b/lib/RPGEngine/Render/GUI.hs new file mode 100644 index 0000000..e29b012 --- /dev/null +++ b/lib/RPGEngine/Render/GUI.hs @@ -0,0 +1,10 @@ +module RPGEngine.Render.GUI +( renderGUI +) where + +import RPGEngine.Data (Game) +import Graphics.Gloss (Picture, blank) + +-- TODO +renderGUI :: Game -> Picture +renderGUI _ = blank diff --git a/lib/RPGEngine/Render/Level.hs b/lib/RPGEngine/Render/Level.hs new file mode 100644 index 0000000..267316c --- /dev/null +++ b/lib/RPGEngine/Render/Level.hs @@ -0,0 +1,10 @@ +module RPGEngine.Render.Level +( renderLevel +) where + +import Graphics.Gloss +import RPGEngine.Data + +-- TODO +renderLevel :: Level -> Picture +renderLevel _ = text "Level" \ No newline at end of file diff --git a/lib/RPGEngine/Render/Player.hs b/lib/RPGEngine/Render/Player.hs new file mode 100644 index 0000000..0d5f65c --- /dev/null +++ b/lib/RPGEngine/Render/Player.hs @@ -0,0 +1,11 @@ +module RPGEngine.Render.Player +( renderPlayer +) where + +import RPGEngine.Data (Player(..)) + +import Graphics.Gloss (Picture, text) +import RPGEngine.Render.Core (getRender, setRenderPos) + +renderPlayer :: Player -> Picture +renderPlayer Player{ coord = (x, y) } = setRenderPos x y $ getRender "player" diff --git a/rpg-engine.cabal b/rpg-engine.cabal index 0823b23..51f2809 100644 --- a/rpg-engine.cabal +++ b/rpg-engine.cabal @@ -19,6 +19,7 @@ library RPGEngine.Input RPGEngine.Input.Core + RPGEngine.Input.Player RPGEngine.Parse RPGEngine.Parse.Core @@ -26,6 +27,10 @@ library RPGEngine.Parse.StructElement RPGEngine.Render + RPGEngine.Render.Core + RPGEngine.Render.GUI + RPGEngine.Render.Level + RPGEngine.Render.Player executable rpg-engine main-is: Main.hs