1
Fork 0

#1 Handle multiple key input

This commit is contained in:
Tibo De Peuter 2022-11-14 18:20:43 +01:00
parent 13ee95c6ec
commit 33c9a877d2

60
lib/InputHandler.hs Normal file
View 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