From 33c9a877d22c2f8a560769aa984c3906e096cb17 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 14 Nov 2022 18:20:43 +0100 Subject: [PATCH] #1 Handle multiple key input --- lib/InputHandler.hs | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 lib/InputHandler.hs diff --git a/lib/InputHandler.hs b/lib/InputHandler.hs new file mode 100644 index 0000000..9c04223 --- /dev/null +++ b/lib/InputHandler.hs @@ -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