#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