#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