36 lines
1.2 KiB
Haskell
36 lines
1.2 KiB
Haskell
![]() |
{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}
|
||
|
|
||
|
module DefaultPlayer ( DefaultPlayer(..)
|
||
|
) where
|
||
|
|
||
|
|
||
|
import qualified Data.Set as S
|
||
|
import Data.Fixed
|
||
|
import Data.Ratio ((%))
|
||
|
import Data.Typeable
|
||
|
|
||
|
import GLDriver
|
||
|
import Player
|
||
|
import Tank
|
||
|
|
||
|
|
||
|
data DefaultPlayer = DefaultPlayer (S.Set Key)
|
||
|
deriving (Typeable, Show)
|
||
|
|
||
|
instance Player DefaultPlayer where
|
||
|
playerMovement (DefaultPlayer keys) _ = playerMovement' keys
|
||
|
|
||
|
handleEvent (DefaultPlayer keys) ev
|
||
|
| Just (KeyPressEvent key) <- fromEvent ev = DefaultPlayer $ S.insert key keys
|
||
|
| Just (KeyReleaseEvent key) <- fromEvent ev = DefaultPlayer $ S.delete key keys
|
||
|
| otherwise = DefaultPlayer keys
|
||
|
|
||
|
|
||
|
playerMovement' :: S.Set Key -> (DefaultPlayer, Maybe Micro, Bool)
|
||
|
playerMovement' keys = (DefaultPlayer keys, angle, move)
|
||
|
where
|
||
|
x = (if (S.member KeyLeft keys) then (-1) else 0) + (if (S.member KeyRight keys) then 1 else 0)
|
||
|
y = (if (S.member KeyDown keys) then (-1) else 0) + (if (S.member KeyUp keys) then 1 else 0)
|
||
|
move = (x /= 0 || y /= 0)
|
||
|
angle = if move then Just $ fromRational $ round ((atan2 y x)*1000000*180/pi)%1000000 else Nothing
|