parent
							
								
									de02c7113f
								
							
						
					
					
						commit
						fb4bc5bb36
					
				
					 12 changed files with 158 additions and 9 deletions
				
			
		|  | @ -7,7 +7,8 @@ data Game = Game { | |||
|     -- Current state of the game | ||||
|     state   :: State, | ||||
|     playing :: Level, | ||||
|     levels  :: [Level] | ||||
|     levels  :: [Level], | ||||
|     player  :: Player | ||||
| } | ||||
| 
 | ||||
| ------------------------------- Level -------------------------------- | ||||
|  | @ -30,9 +31,13 @@ data Physical = Void | |||
| 
 | ||||
| ------------------------------- Player ------------------------------- | ||||
| 
 | ||||
| type X = Int | ||||
| type Y = Int | ||||
| 
 | ||||
| data Player = Player { | ||||
|     playerHp  :: Maybe Int, | ||||
|     inventory :: [Item] | ||||
|     inventory :: [Item], | ||||
|     coord     :: (X, Y) | ||||
| } deriving (Eq, Show) | ||||
| 
 | ||||
| instance Living Player where | ||||
|  |  | |||
|  | @ -18,9 +18,10 @@ defaultEntity = Entity { | |||
| -- Initialize the game | ||||
| initGame :: Game | ||||
| initGame = Game {  | ||||
|     state = defaultState, | ||||
|     state   = defaultState, | ||||
|     playing = defaultLevel, | ||||
|     levels = [defaultLevel] | ||||
|     levels  = [defaultLevel], | ||||
|     player  = defaultPlayer | ||||
| } | ||||
| 
 | ||||
| defaultItem :: Item | ||||
|  | @ -51,8 +52,9 @@ defaultLevel = Level { | |||
| 
 | ||||
| defaultPlayer :: Player | ||||
| defaultPlayer = Player { | ||||
|     playerHp = Prelude.Nothing, -- Compares to infinity | ||||
|     inventory = [] | ||||
|     playerHp  = Prelude.Nothing, -- Compares to infinity | ||||
|     inventory = [], | ||||
|     coord     = (0, 0) | ||||
| } | ||||
| 
 | ||||
| -- Default state of the game, Menu | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ module RPGEngine.Input | |||
| import RPGEngine.Data | ||||
| import RPGEngine.Data.State | ||||
| import RPGEngine.Input.Core | ||||
| import RPGEngine.Input.Player | ||||
| 
 | ||||
| import Graphics.Gloss.Interface.IO.Game | ||||
| 
 | ||||
|  | @ -22,7 +23,19 @@ handleAllInput ev g                         = handleAnyKey setNextState ev g | |||
| -- Input for 'Playing' state | ||||
| handlePlayInputs :: InputHandler Game | ||||
| handlePlayInputs = composeInputHandlers [ | ||||
|     handleKey (Char 'p') (\game -> 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 | ||||
|  |  | |||
							
								
								
									
										19
									
								
								lib/RPGEngine/Input/Player.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lib/RPGEngine/Input/Player.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -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) | ||||
|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										63
									
								
								lib/RPGEngine/Render/Core.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								lib/RPGEngine/Render/Core.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										10
									
								
								lib/RPGEngine/Render/GUI.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								lib/RPGEngine/Render/GUI.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										10
									
								
								lib/RPGEngine/Render/Level.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								lib/RPGEngine/Render/Level.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| module RPGEngine.Render.Level  | ||||
| ( renderLevel | ||||
| ) where | ||||
| 
 | ||||
| import Graphics.Gloss | ||||
| import RPGEngine.Data | ||||
| 
 | ||||
| -- TODO | ||||
| renderLevel :: Level -> Picture | ||||
| renderLevel _ = text "Level" | ||||
							
								
								
									
										11
									
								
								lib/RPGEngine/Render/Player.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								lib/RPGEngine/Render/Player.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -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" | ||||
		Reference in a new issue