summaryrefslogtreecommitdiffstats
path: root/DefaultPlayer.hs
blob: d1c1e24e84f1b9f16b56d34355b53c39707fa293 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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) Micro Micro
                     deriving (Typeable, Show)

instance Player DefaultPlayer where
    playerUpdate (DefaultPlayer keys aimx aimy) tank = playerUpdate' keys aimx aimy tank
    
    handleEvent (DefaultPlayer keys aimx aimy) ev
        | Just (KeyPressEvent key)   <- fromEvent ev = DefaultPlayer (S.insert key keys) aimx aimy
        | Just (KeyReleaseEvent key) <- fromEvent ev = DefaultPlayer (S.delete key keys) aimx aimy
        | otherwise = DefaultPlayer keys aimx aimy


playerUpdate' :: S.Set Key -> Micro -> Micro -> Tank -> (DefaultPlayer, Maybe Micro, Bool, Maybe Micro)
playerUpdate' keys aimx aimy tank = (DefaultPlayer keys aimx aimy, angle, move, Nothing)
    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