From 83f0606ea9dfd6b493097dc97330055dff4a2867 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 24 Jun 2011 21:50:32 +0200 Subject: Added Transformable class to simplify collision calculation --- src/DefaultPlayer.hs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/DefaultPlayer.hs') diff --git a/src/DefaultPlayer.hs b/src/DefaultPlayer.hs index e16502a..00dce95 100644 --- a/src/DefaultPlayer.hs +++ b/src/DefaultPlayer.hs @@ -16,8 +16,9 @@ import Graphics.Rendering.OpenGL.GL.VertexSpec import Tank import GLDriver import Player - - +import Vector +import Transformable (Coord) +import Data.VectorSpace data DefaultPlayer = DefaultPlayer (S.Set Key) Float Float Bool deriving (Typeable, Show) @@ -26,12 +27,12 @@ instance Player DefaultPlayer where playerUpdate (DefaultPlayer keys aimx aimy shoot) tank = let 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) - ax = aimx - (fromRational . toRational . tankX $ tank) - ay = aimy - (fromRational . toRational . tankY $ tank) + ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) + ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) move = (x /= 0 || y /= 0) - angle = if move then Just $ fromRational $ round ((atan2 y x)*1000000*180/pi)%1000000 else Nothing - aangle = if (ax /= 0 || ay /= 0) then Just $ fromRational $ round ((atan2 ay ax)*1000000*180/pi)%1000000 else Nothing - in return (DefaultPlayer keys aimx aimy False, angle, move, aangle, shoot) + dir = if move then Just (normalized $ Vector x y) else Nothing + adir = if (ax /= 0 || ay /= 0) then Just (normalized $ Vector ax ay) else Nothing + in return (DefaultPlayer keys aimx aimy False, dir, move, adir, shoot) handleEvent (DefaultPlayer keys aimx aimy shoot) ev | Just (KeyPressEvent key) <- fromEvent ev = DefaultPlayer (S.insert key keys) aimx aimy shoot -- cgit v1.2.3