#1 Handle multiple key input
This commit is contained in:
parent
13ee95c6ec
commit
33c9a877d2
1 changed files with 60 additions and 0 deletions
60
lib/InputHandler.hs
Normal file
60
lib/InputHandler.hs
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
module InputHandler
|
||||||
|
( Event
|
||||||
|
|
||||||
|
, handleInput
|
||||||
|
, composeInputHandler
|
||||||
|
|
||||||
|
, handleSpace
|
||||||
|
, handleEnter
|
||||||
|
, handleUp
|
||||||
|
, handleDown
|
||||||
|
, handleLeft
|
||||||
|
, handleRight
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Graphics.Gloss
|
||||||
|
import qualified Graphics.Gloss.Interface.IO.Game as Game
|
||||||
|
|
||||||
|
----------------------------- Constants ------------------------------
|
||||||
|
|
||||||
|
-- Something that happens, most often a keypress
|
||||||
|
type Event = Game.Event
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- Handle input by taking a keyCheck function that checks wheter or not
|
||||||
|
-- a key is being presse
|
||||||
|
handleInput :: Game.SpecialKey -> (a -> a) -> Event -> a -> a
|
||||||
|
handleInput key convert ev currentState
|
||||||
|
| isKey key ev = convert currentState
|
||||||
|
| otherwise = currentState
|
||||||
|
|
||||||
|
-- Compose multiple InputHandlers into one combined InputHandler.
|
||||||
|
composeInputHandler :: [Event -> a -> a] -> Event -> a -> a
|
||||||
|
composeInputHandler (ih:ihs) ev a = composeInputHandler ihs ev (ih ev a)
|
||||||
|
composeInputHandler [] ev a = a
|
||||||
|
|
||||||
|
-- Check if the requested key is pressed.
|
||||||
|
isKey :: Game.SpecialKey -> Event -> Bool
|
||||||
|
isKey k1 (Game.EventKey (Game.SpecialKey k2) Game.Down _ _) = k1 == k2
|
||||||
|
isKey _ _ = False
|
||||||
|
|
||||||
|
------------------ A couple of default inputhandlers -----------------
|
||||||
|
|
||||||
|
handleSpace :: (a -> a) -> Event -> a -> a
|
||||||
|
handleSpace = handleInput Game.KeySpace
|
||||||
|
|
||||||
|
handleEnter :: (a -> a) -> Event -> a -> a
|
||||||
|
handleEnter = handleInput Game.KeyEnter
|
||||||
|
|
||||||
|
handleUp :: (a -> a) -> Event -> a -> a
|
||||||
|
handleUp = handleInput Game.KeyUp
|
||||||
|
|
||||||
|
handleDown :: (a -> a) -> Event -> a -> a
|
||||||
|
handleDown = handleInput Game.KeyDown
|
||||||
|
|
||||||
|
handleLeft :: (a -> a) -> Event -> a -> a
|
||||||
|
handleLeft = handleInput Game.KeyLeft
|
||||||
|
|
||||||
|
handleRight :: (a -> a) -> Event -> a -> a
|
||||||
|
handleRight = handleInput Game.KeyRight
|
Reference in a new issue