dev #16
13 changed files with 239 additions and 29 deletions
37
lib/RPGEngine.hs
Normal file
37
lib/RPGEngine.hs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
-- Allows to play a game using RPGEngine.
|
||||||
|
-- Includes all logic and rendering.
|
||||||
|
|
||||||
|
module RPGEngine
|
||||||
|
( playRPGEngine
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Game
|
||||||
|
import Render
|
||||||
|
import Input
|
||||||
|
|
||||||
|
import Graphics.Gloss (
|
||||||
|
Color(..)
|
||||||
|
, white
|
||||||
|
, play
|
||||||
|
)
|
||||||
|
|
||||||
|
----------------------------- Constants ------------------------------
|
||||||
|
|
||||||
|
-- Dimensions for main window
|
||||||
|
winDimensions :: (Int, Int)
|
||||||
|
winDimensions = (1280, 720)
|
||||||
|
|
||||||
|
-- Offsets for main window
|
||||||
|
winOffsets :: (Int, Int)
|
||||||
|
winOffsets = (0, 0)
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- This is the gameloop.
|
||||||
|
-- It can receive input and update itself. It is rendered by a renderer.
|
||||||
|
playRPGEngine :: String -> Int -> IO()
|
||||||
|
playRPGEngine title fps = do
|
||||||
|
play window bgColor fps initGame render handleInputs step
|
||||||
|
where window = initWindow title winDimensions winOffsets
|
||||||
|
step _ g = g -- TODO Do something with step?
|
||||||
|
handleInputs = handleAllInput
|
|
@ -1,10 +0,0 @@
|
||||||
module VoorbeeldModule
|
|
||||||
( hoi -- oplijsting van de publieke functies - als je deze lijst en de haakjes weglaat, wordt alles publiek
|
|
||||||
, hallo
|
|
||||||
) where
|
|
||||||
|
|
||||||
hoi :: String
|
|
||||||
hoi = "Hoi"
|
|
||||||
|
|
||||||
hallo :: String
|
|
||||||
hallo = "Hallo"
|
|
23
lib/control/Input.hs
Normal file
23
lib/control/Input.hs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
module Input
|
||||||
|
(
|
||||||
|
-- Handle all input for RPG-Engine
|
||||||
|
handleAllInput
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Game
|
||||||
|
import State
|
||||||
|
import InputHandling
|
||||||
|
|
||||||
|
import Graphics.Gloss.Interface.IO.Game
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
handleAllInput :: InputHandler Game
|
||||||
|
handleAllInput = composeInputHandlers [
|
||||||
|
handleSpecialKey KeySpace setNextState
|
||||||
|
]
|
||||||
|
|
||||||
|
-- Go to the next stage of the Game
|
||||||
|
setNextState :: Game -> Game
|
||||||
|
setNextState game = game{ state = newState }
|
||||||
|
where newState = nextState $ state game
|
41
lib/control/InputHandling.hs
Normal file
41
lib/control/InputHandling.hs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
-- Allows to create a massive inputHandler that can handle anything
|
||||||
|
-- after you specify what you want it to do.
|
||||||
|
|
||||||
|
module InputHandling
|
||||||
|
( InputHandler(..),
|
||||||
|
-- Compose multiple InputHandlers into one InputHandler that handles
|
||||||
|
-- all of them.
|
||||||
|
composeInputHandlers,
|
||||||
|
|
||||||
|
handle,
|
||||||
|
handleSpecialKey
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Graphics.Gloss.Interface.IO.Game
|
||||||
|
|
||||||
|
----------------------------- Constants ------------------------------
|
||||||
|
|
||||||
|
type InputHandler a = Event -> (a -> a)
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
composeInputHandlers :: [InputHandler a] -> InputHandler a
|
||||||
|
composeInputHandlers [] ev a = a
|
||||||
|
composeInputHandlers (ih:ihs) ev a = composeInputHandlers ihs ev (ih ev a)
|
||||||
|
|
||||||
|
handle :: Event -> (a -> a) -> Event -> (a -> a)
|
||||||
|
handle (EventKey key _ _ _) = handleKey key
|
||||||
|
-- handle (EventMotion _) = undefined
|
||||||
|
-- handle (EventResize _) = undefined
|
||||||
|
handle _ = (\_ -> (\_ -> id))
|
||||||
|
|
||||||
|
handleKey :: Key -> (a -> a) -> Event -> (a -> a)
|
||||||
|
handleKey (SpecialKey key) = handleSpecialKey key
|
||||||
|
handleKey (Char _ ) = (\_ -> (\_ -> id))
|
||||||
|
handleKey (MouseButton _ ) = (\_ -> (\_ -> id))
|
||||||
|
|
||||||
|
handleSpecialKey :: SpecialKey -> (a -> a) -> Event -> (a -> a)
|
||||||
|
handleSpecialKey sk1 f (EventKey (SpecialKey sk2) Down _ _)
|
||||||
|
| sk1 == sk2 = f
|
||||||
|
| otherwise = id
|
||||||
|
handleSpecialKey _ _ _ = id
|
25
lib/data/Game.hs
Normal file
25
lib/data/Game.hs
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
-- Representation of all the game's data
|
||||||
|
|
||||||
|
module Game
|
||||||
|
( Game(..)
|
||||||
|
|
||||||
|
-- Initialize the game
|
||||||
|
, initGame
|
||||||
|
) where
|
||||||
|
|
||||||
|
import State
|
||||||
|
|
||||||
|
----------------------------- Constants ------------------------------
|
||||||
|
|
||||||
|
-- TODO Add more
|
||||||
|
data Game = Game {
|
||||||
|
-- Current state of the game
|
||||||
|
state :: State
|
||||||
|
}
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
initGame :: Game
|
||||||
|
initGame = Game {
|
||||||
|
state = defaultState
|
||||||
|
}
|
32
lib/data/State.hs
Normal file
32
lib/data/State.hs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
-- Describes the current state of the game,
|
||||||
|
-- e.g. Main menu, game, pause, win or lose
|
||||||
|
-- Allows to easily go to a next state and change rendering accordingly
|
||||||
|
|
||||||
|
module State
|
||||||
|
( State(..)
|
||||||
|
-- Default state of the game, Menu
|
||||||
|
, defaultState
|
||||||
|
|
||||||
|
-- Get the next state based on the current state
|
||||||
|
, nextState
|
||||||
|
) where
|
||||||
|
|
||||||
|
----------------------------- Constants ------------------------------
|
||||||
|
|
||||||
|
-- Current state of the game.
|
||||||
|
data State = Menu
|
||||||
|
| Playing
|
||||||
|
| Pause
|
||||||
|
| Win
|
||||||
|
| Lose
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
defaultState :: State
|
||||||
|
defaultState = Menu
|
||||||
|
|
||||||
|
nextState :: State -> State
|
||||||
|
nextState Menu = Playing
|
||||||
|
nextState Playing = Pause
|
||||||
|
nextState Pause = Playing
|
||||||
|
nextState _ = Menu
|
47
lib/render/Render.hs
Normal file
47
lib/render/Render.hs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
-- Allows to render the played game
|
||||||
|
|
||||||
|
module Render
|
||||||
|
(
|
||||||
|
-- Initialize a window to play in
|
||||||
|
initWindow
|
||||||
|
|
||||||
|
-- Render the game
|
||||||
|
, render
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Game(Game(..))
|
||||||
|
import State(State(..))
|
||||||
|
import Graphics.Gloss
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
initWindow :: String -> (Int, Int) -> (Int, Int) -> Display
|
||||||
|
initWindow title dims offs = InWindow title dims offs
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
-- TODO
|
||||||
|
renderMenu :: Game -> Picture
|
||||||
|
renderMenu _ = text "Menu"
|
||||||
|
|
||||||
|
-- TODO
|
||||||
|
renderPlaying :: Game -> Picture
|
||||||
|
renderPlaying _ = text "Playing"
|
||||||
|
|
||||||
|
-- TODO
|
||||||
|
renderPause :: Game -> Picture
|
||||||
|
renderPause _ = text "Pause"
|
||||||
|
|
||||||
|
-- TODO
|
||||||
|
renderWin :: Game -> Picture
|
||||||
|
renderWin _ = text "Win"
|
||||||
|
|
||||||
|
-- TODO
|
||||||
|
renderLose :: Game -> Picture
|
||||||
|
renderLose _ = text "Lose"
|
|
@ -1,13 +1,19 @@
|
||||||
name: rpg-engine
|
name: rpg-engine
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
author: Author name here
|
author: Tibo De Peuter
|
||||||
cabal-version: 1.12
|
cabal-version: 1.12
|
||||||
build-type: Simple
|
build-type: Simple
|
||||||
|
|
||||||
library
|
library
|
||||||
hs-source-dirs: lib
|
hs-source-dirs: lib, lib/control, lib/data, lib/render
|
||||||
build-depends: base >= 4.7 && <5
|
build-depends:
|
||||||
exposed-modules: VoorbeeldModule
|
base >= 4.7 && <5,
|
||||||
|
gloss >= 1.11 && < 1.14, gloss-juicy >= 0.2.3
|
||||||
|
exposed-modules:
|
||||||
|
RPGEngine,
|
||||||
|
Input, InputHandling,
|
||||||
|
Game, State,
|
||||||
|
Render
|
||||||
|
|
||||||
executable rpg-engine
|
executable rpg-engine
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
|
@ -17,7 +23,7 @@ executable rpg-engine
|
||||||
|
|
||||||
test-suite rpg-engine-test
|
test-suite rpg-engine-test
|
||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
main-is: VoorbeeldTest.hs
|
main-is: RPG-Engine-Test.hs
|
||||||
hs-source-dirs: test
|
hs-source-dirs: test
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
build-depends: base >=4.7 && <5, hspec <= 2.10.6, rpg-engine
|
build-depends: base >=4.7 && <5, hspec <= 2.10.6, rpg-engine
|
||||||
|
|
16
src/Main.hs
16
src/Main.hs
|
@ -1,4 +1,16 @@
|
||||||
import VoorbeeldModule (hoi)
|
import RPGEngine
|
||||||
|
|
||||||
|
----------------------------- Constants ------------------------------
|
||||||
|
|
||||||
|
-- Title of the game
|
||||||
|
title :: String
|
||||||
|
title = "RPG Engine"
|
||||||
|
|
||||||
|
-- Framerate of the game
|
||||||
|
fps :: Int
|
||||||
|
fps = 60
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = putStrLn hoi
|
main = playRPGEngine title fps
|
||||||
|
|
|
@ -35,12 +35,13 @@ packages:
|
||||||
# These entries can reference officially published versions as well as
|
# These entries can reference officially published versions as well as
|
||||||
# forks / in-progress versions pinned to a git hash. For example:
|
# forks / in-progress versions pinned to a git hash. For example:
|
||||||
#
|
#
|
||||||
# extra-deps:
|
extra-deps:
|
||||||
# - acme-missiles-0.3
|
# - acme-missiles-0.3
|
||||||
# - git: https://github.com/commercialhaskell/stack.git
|
# - git: https://github.com/commercialhaskell/stack.git
|
||||||
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||||
#
|
#
|
||||||
# extra-deps: []
|
# extra-deps: []
|
||||||
|
- gloss-juicy-0.2.3@sha256:0c3bca95237cbf91f8b3b1936a0661f1e0457acd80502276d54d6c5210f88b25,1618
|
||||||
|
|
||||||
# Override default flag values for local packages and extra-deps
|
# Override default flag values for local packages and extra-deps
|
||||||
# flags: {}
|
# flags: {}
|
||||||
|
|
7
test/RPG-Engine-Test.hs
Normal file
7
test/RPG-Engine-Test.hs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import Test.Hspec
|
||||||
|
|
||||||
|
main :: IO()
|
||||||
|
main = hspec $ do
|
||||||
|
describe "Dummy category" $ do
|
||||||
|
it "Dummy test" $ do
|
||||||
|
0 `shouldBe` 0
|
|
@ -1,11 +0,0 @@
|
||||||
import Test.Hspec
|
|
||||||
|
|
||||||
import VoorbeeldModule (hoi, hallo)
|
|
||||||
|
|
||||||
main :: IO ()
|
|
||||||
main = hspec $ do
|
|
||||||
it "Returns correct string for hoi" $ do
|
|
||||||
hoi `shouldBe` "Hoi"
|
|
||||||
|
|
||||||
it "Returns correct string for hallo" $ do
|
|
||||||
hallo `shouldBe` "Hallo"
|
|
0
verslag.pdf
Normal file
0
verslag.pdf
Normal file
Reference in a new issue