summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2010-03-09 06:45:02 +0100
committerMatthias Schiffer <matthias@gamezock.de>2010-03-09 06:45:02 +0100
commit4993b2ef07ad22f299c60eeec1d96f94cfe4a47c (patch)
tree0320d7a0bb96f9f01c8d210e3d80155dc85eb632
parent89e87826a8b5874cee1ce370315e0af4b9297000 (diff)
downloadhtanks-4993b2ef07ad22f299c60eeec1d96f94cfe4a47c.tar
htanks-4993b2ef07ad22f299c60eeec1d96f94cfe4a47c.zip
Reflect bullets at the level border
-rw-r--r--src/Game.hs16
-rw-r--r--src/HTanks.hs39
2 files changed, 32 insertions, 23 deletions
diff --git a/src/Game.hs b/src/Game.hs
index 9aef422..248287b 100644
--- a/src/Game.hs
+++ b/src/Game.hs
@@ -17,13 +17,13 @@ import qualified Data.Map as M
data Tank = Tank
- { tankX :: !Micro
- , tankY :: !Micro
- , tankDir :: !Micro
- , tankAim :: !Micro
- , tankSpeed :: !Micro
- , tankTurnspeed :: !Micro
- , tankMoving :: !Bool
+ { tankX :: !Micro
+ , tankY :: !Micro
+ , tankDir :: !Micro
+ , tankAim :: !Micro
+ , tankSpeed :: !Micro
+ , tankTurnspeed :: !Micro
+ , tankMoving :: !Bool
, tankBulletSpeed :: !Micro
, tankBulletBounces :: !Int
, tankBulletsLeft :: !Int
@@ -41,7 +41,7 @@ data Bullet = Bullet
data GameState = GameState
{ level :: !Level
, tanks :: ![Tank]
- , bullets :: ![Bullet]
+ , bullets :: ![Bullet]
, textures :: !(M.Map Texture TextureObject)
} deriving (Show)
diff --git a/src/HTanks.hs b/src/HTanks.hs
index 4557809..4b66944 100644
--- a/src/HTanks.hs
+++ b/src/HTanks.hs
@@ -147,14 +147,23 @@ updateTank angle move aangle = do
modify $ \tank -> tank {tankMoving = False}
-updateBullet :: State Bullet ()
-updateBullet = do
- angle <- gets bulletDir >>= return . (/180) . (*pi) . fromRational . toRational
- speed <- gets bulletSpeed
- let dx = speed * fromRational (round ((cos angle)*1000)%1000000)
+updateBullet :: GameState -> State Bullet ()
+updateBullet game = do
+ bullet <- get
+ let angle = (fromRational . toRational . bulletDir $ bullet)*pi/180
+ speed = bulletSpeed bullet
+ dx = speed * fromRational (round ((cos angle)*1000)%1000000)
dy = speed * fromRational (round ((sin angle)*1000)%1000000)
-
- modify $ \bullet -> bullet {bulletX = dx + bulletX bullet, bulletY = dy + bulletY bullet}
+ x = dx + bulletX bullet
+ y = dy + bulletY bullet
+ lw = fromIntegral . levelWidth . level $ game
+ lh = fromIntegral . levelHeight . level $ game
+ dir = bulletDir bullet
+
+ (newx, dir2) = if x < 0 then (-x, (signum dir)*180 - dir) else if x > lw then (2*lw-x, (signum dir)*180 - dir) else (x, dir)
+ (newy, dir3) = if y < 0 then (-y, -dir2) else if y > lh then (2*lh-y, -dir2) else (y, dir2)
+
+ put bullet {bulletX = newx, bulletY = newy, bulletDir = dir3}
simulationStep :: Main ()
@@ -167,17 +176,17 @@ simulationStep = do
bulletingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, bullet, _) -> bullet && (tankBulletsLeft tank) > 0) $ ts
newtanks = map (\(tank, bullet, _) -> if bullet then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts
newbullets = map (\(tank, n) -> Bullet
- { bulletX = tankX tank
- , bulletY = tankY tank
- , bulletDir = tankAim tank
- , bulletSpeed = tankBulletSpeed tank
- , bulletBouncesLeft = tankBulletBounces tank
- , bulletTank = n
- }) bulletingtanks
+ { bulletX = tankX tank
+ , bulletY = tankY tank
+ , bulletDir = tankAim tank
+ , bulletSpeed = tankBulletSpeed tank
+ , bulletBouncesLeft = tankBulletBounces tank
+ , bulletTank = n
+ }) bulletingtanks
modify $ \state -> state {players = p}
- lift $ modify $ \state -> state {tanks = newtanks, bullets = map (execState updateBullet) (newbullets ++ bullets state)}
+ lift $ modify $ \state -> state {tanks = newtanks, bullets = map (execState $ updateBullet state) (newbullets ++ bullets state)}
where
updateTank' (player, tank) = let (p, angle, move, aangle, bullet) = playerUpdate player tank
t = execState (updateTank angle move aangle) tank