#9 Added level selection render
This commit is contained in:
		
							parent
							
								
									0786a41006
								
							
						
					
					
						commit
						2055ef234e
					
				
					 17 changed files with 401 additions and 34 deletions
				
			
		|  | @ -48,6 +48,7 @@ instance Living Player where | |||
| 
 | ||||
| -- Current state of the game. | ||||
| data State = Menu | ||||
|            | LvlSelect | ||||
|            | Playing | ||||
|            | Pause | ||||
|            | Win | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ import RPGEngine.Data | |||
| 
 | ||||
| -- Get the next state based on the current state | ||||
| nextState :: State -> State | ||||
| nextState Menu = Playing | ||||
| nextState Menu = LvlSelect | ||||
| nextState Playing = Pause | ||||
| nextState Pause = Playing | ||||
| nextState _ = Menu | ||||
|  |  | |||
|  | @ -15,8 +15,9 @@ import Graphics.Gloss.Interface.IO.Game | |||
| 
 | ||||
| -- Handle all input for RPG-Engine | ||||
| handleAllInput :: InputHandler Game | ||||
| handleAllInput ev g@Game{ state = Playing } = handlePlayInputs ev g | ||||
| handleAllInput ev g                         = handleAnyKey setNextState ev g | ||||
| handleAllInput ev g@Game{ state = Playing   } = handlePlayInputs ev g | ||||
| handleAllInput ev g@Game{ state = LvlSelect } = handleLvlSelectInput ev g | ||||
| handleAllInput ev g                           = handleAnyKey setNextState ev g | ||||
| 
 | ||||
| ---------------------------------------------------------------------- | ||||
| 
 | ||||
|  | @ -38,6 +39,10 @@ handlePlayInputs = composeInputHandlers [ | |||
|     handleKey (Char 'a') $ movePlayer West | ||||
|     ] | ||||
| 
 | ||||
| -- Input for selection a level to load | ||||
| handleLvlSelectInput :: InputHandler Game | ||||
| handleLvlSelectInput = composeInputHandlers [] | ||||
| 
 | ||||
| -- Go to the next stage of the Game | ||||
| setNextState :: Game -> Game | ||||
| setNextState game = game{ state = newState } | ||||
|  |  | |||
							
								
								
									
										12
									
								
								lib/RPGEngine/Input/LvlSelect.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								lib/RPGEngine/Input/LvlSelect.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| module RPGEngine.Input.LvlSelect | ||||
| ( getLvlList | ||||
| ) where | ||||
| 
 | ||||
| import GHC.IO (unsafePerformIO) | ||||
| import System.Directory (getDirectoryContents) | ||||
| 
 | ||||
| lvlFolder :: FilePath | ||||
| lvlFolder = "levels" | ||||
| 
 | ||||
| getLvlList :: [FilePath] | ||||
| getLvlList = unsafePerformIO $ getDirectoryContents lvlFolder | ||||
|  | @ -9,14 +9,24 @@ module RPGEngine.Render | |||
| 
 | ||||
| import RPGEngine.Data | ||||
|     ( State(..), | ||||
|       Game(..) ) | ||||
| import RPGEngine.Render.Level  | ||||
|       Game(..), Player (..) ) | ||||
| import RPGEngine.Render.Level | ||||
|     ( renderLevel ) | ||||
| 
 | ||||
| import Graphics.Gloss | ||||
|     ( white, pictures, text, Display(InWindow), Color, Picture ) | ||||
| import RPGEngine.Render.Player (renderPlayer) | ||||
|     ( white, | ||||
|       pictures, | ||||
|       text, | ||||
|       Display(InWindow), | ||||
|       Color, | ||||
|       Picture, | ||||
|       scale, | ||||
|       translate ) | ||||
| import RPGEngine.Render.Player (renderPlayer, focusPlayer) | ||||
| import RPGEngine.Render.GUI (renderGUI) | ||||
| import Graphics.Gloss.Data.Picture (color) | ||||
| import RPGEngine.Render.Core (overlay) | ||||
| import RPGEngine.Input.LvlSelect (getLvlList) | ||||
| import RPGEngine.Render.LvlSelect (renderLvlList) | ||||
| 
 | ||||
| ----------------------------- Constants ------------------------------ | ||||
| 
 | ||||
|  | @ -32,11 +42,12 @@ initWindow = InWindow | |||
| 
 | ||||
| -- Render the game | ||||
| render :: Game -> Picture | ||||
| render g@Game{ state = Menu    } = renderMenu g | ||||
| render g@Game{ state = Playing } = renderPlaying g | ||||
| render g@Game{ state = Pause   } = renderPause g | ||||
| render g@Game{ state = Win     } = renderWin g | ||||
| render g@Game{ state = Lose    } = renderLose g | ||||
| render g@Game{ state = Menu      } = renderMenu g | ||||
| render g@Game{ state = LvlSelect } = renderLevelSelection g | ||||
| render g@Game{ state = Playing   } = renderPlaying g | ||||
| render g@Game{ state = Pause     } = renderPause g | ||||
| render g@Game{ state = Win       } = renderWin g | ||||
| render g@Game{ state = Lose      } = renderLose g | ||||
| 
 | ||||
| ---------------------------------------------------------------------- | ||||
| 
 | ||||
|  | @ -44,6 +55,10 @@ render g@Game{ state = Lose    } = renderLose g | |||
| renderMenu :: Game -> Picture | ||||
| renderMenu _ = text "[Press any key to start]" | ||||
| 
 | ||||
| -- TODO | ||||
| renderLevelSelection :: Game -> Picture | ||||
| renderLevelSelection _ = renderLvlList getLvlList | ||||
| 
 | ||||
| renderPlaying :: Game -> Picture | ||||
| renderPlaying g@Game{ playing = lvl, player = player } = pictures [ | ||||
|     renderLevel lvl, | ||||
|  | @ -51,9 +66,12 @@ renderPlaying g@Game{ playing = lvl, player = player } = pictures [ | |||
|     renderGUI g | ||||
|     ] | ||||
| 
 | ||||
| -- TODO | ||||
| renderPause :: Game -> Picture | ||||
| renderPause _ = text "[Press any key to continue]" | ||||
| renderPause g = pictures [renderPlaying g, pause] | ||||
|     where pause = pictures [ | ||||
|             overlay, | ||||
|             color white $ scale 0.5 0.5 $ text "[Press any key to continue]" | ||||
|             ] | ||||
| 
 | ||||
| -- TODO | ||||
| renderWin :: Game -> Picture | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| module RPGEngine.Render.Core where | ||||
| 
 | ||||
| import Graphics.Gloss ( Picture, translate ) | ||||
| import Graphics.Gloss ( Picture, translate, pictures ) | ||||
| import GHC.IO (unsafePerformIO) | ||||
| import Graphics.Gloss.Juicy (loadJuicyPNG) | ||||
| import Data.Maybe (fromJust) | ||||
|  | @ -21,7 +21,7 @@ assetsFolder :: FilePath | |||
| assetsFolder = "assets/" | ||||
| 
 | ||||
| unknownImage :: FilePath | ||||
| unknownImage = "unkown.png" | ||||
| unknownImage = "unknown.png" | ||||
| 
 | ||||
| allEntities :: [(String, FilePath)] | ||||
| allEntities = [ | ||||
|  | @ -32,6 +32,7 @@ allEntities = [ | |||
| allEnvironment :: [(String, FilePath)] | ||||
| allEnvironment = [ | ||||
|     ("void",     "void.png"), | ||||
|     ("overlay",  "overlay.png"), | ||||
|     ("tile",     "tile.png"), | ||||
|     ("wall",     "wall.png"), | ||||
|     ("entrance", "entrance.png"), | ||||
|  | @ -47,7 +48,7 @@ allItems = [ | |||
| -- Map of all renders | ||||
| library :: [(String, Picture)] | ||||
| library = unknown:entities ++ environment ++ gui ++ items | ||||
|     where unknown     = ("unkown", renderPNG (assetsFolder ++ unknownImage)) | ||||
|     where unknown     = ("unknown", renderPNG (assetsFolder ++ unknownImage)) | ||||
|           entities    = map (\(f, s) -> (f, renderPNG (assetsFolder ++ "entities/" ++ s))) allEntities | ||||
|           environment = map (\(f, s) -> (f, renderPNG (assetsFolder ++ "environment/" ++ s))) allEnvironment | ||||
|           gui         = [] | ||||
|  | @ -71,4 +72,14 @@ getRender id = get filtered | |||
| setRenderPos :: Int -> Int -> Picture -> Picture | ||||
| setRenderPos x y = translate floatX floatY | ||||
|     where floatX = fromIntegral x * zoom * resolution | ||||
|           floatY = fromIntegral y * zoom * resolution | ||||
|           floatY = fromIntegral y * zoom * resolution | ||||
| 
 | ||||
| overlay :: Picture | ||||
| overlay = setRenderPos offX offY $ pictures voids | ||||
|     where voids = [setRenderPos x y void | x <- [0 .. width], y <- [0 .. height]] | ||||
|           void  = getRender "overlay" | ||||
|           intZoom = round zoom :: Int | ||||
|           height = round $ 4320 / resolution / zoom | ||||
|           width  = round $ 7680 / resolution / zoom | ||||
|           offX   = negate (width `div` 2) | ||||
|           offY   = negate (height `div` 2) | ||||
							
								
								
									
										15
									
								
								lib/RPGEngine/Render/LvlSelect.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								lib/RPGEngine/Render/LvlSelect.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| module RPGEngine.Render.LvlSelect | ||||
| ( renderLvlList | ||||
| ) where | ||||
| 
 | ||||
| import Graphics.Gloss ( Picture, pictures, translate, scale ) | ||||
| import Graphics.Gloss.Data.Picture (blank, text) | ||||
| import RPGEngine.Render.Core (resolution, zoom) | ||||
| 
 | ||||
| -- Render all level names, under each other. | ||||
| renderLvlList :: [FilePath] -> Picture | ||||
| renderLvlList list = pictures $ map render entries | ||||
|     where entries           = zip [0::Int .. ] list | ||||
|           render  (i, path) = scale zoomed zoomed $ translate 0 (offset i) $ text path | ||||
|           zoomed            = 0.1 * zoom | ||||
|           offset  i         = negate (2 * resolution * zoom * fromIntegral i) | ||||
|  | @ -1,11 +1,17 @@ | |||
| module RPGEngine.Render.Player  | ||||
| ( renderPlayer | ||||
| , focusPlayer | ||||
| ) where | ||||
| 
 | ||||
| import RPGEngine.Data (Player(..)) | ||||
| 
 | ||||
| import RPGEngine.Data (Player(..), Game(..)) | ||||
| import Graphics.Gloss (Picture, text) | ||||
| import RPGEngine.Render.Core (getRender, setRenderPos) | ||||
| import RPGEngine.Render.Core (getRender, setRenderPos, zoom, resolution) | ||||
| import Graphics.Gloss.Data.Picture (translate) | ||||
| 
 | ||||
| renderPlayer :: Player -> Picture | ||||
| renderPlayer Player{ position = (x, y) } = setRenderPos x y $ getRender "player" | ||||
| renderPlayer Player{ position = (x, y) } = setRenderPos x y $ getRender "player" | ||||
| 
 | ||||
| focusPlayer :: Game -> Picture -> Picture | ||||
| focusPlayer Game{ player = Player{ position = (x, y)}} = translate centerX centerY | ||||
|     where centerX = resolution * zoom * fromIntegral (negate x) | ||||
|           centerY = resolution * zoom * fromIntegral (negate y) | ||||
		Reference in a new issue