summaryrefslogtreecommitdiffstats
path: root/DefaultPlayer.hs
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2010-03-02 21:36:37 +0100
committerMatthias Schiffer <matthias@gamezock.de>2010-03-02 21:36:37 +0100
commit8586ef7b8502bc8be2f37026b6e443b5a6cf0868 (patch)
tree80cefe818017f90c1a34f4245d23fd5e7188aece /DefaultPlayer.hs
parentd4db00ce9bce4410becfc4ee71264fc607b96c5b (diff)
downloadhtanks-8586ef7b8502bc8be2f37026b6e443b5a6cf0868.tar
htanks-8586ef7b8502bc8be2f37026b6e443b5a6cf0868.zip
New generic player implementation
Diffstat (limited to 'DefaultPlayer.hs')
-rw-r--r--DefaultPlayer.hs35
1 files changed, 35 insertions, 0 deletions
diff --git a/DefaultPlayer.hs b/DefaultPlayer.hs
new file mode 100644
index 0000000..351928f
--- /dev/null
+++ b/DefaultPlayer.hs
@@ -0,0 +1,35 @@
+{-# 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