summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2010-03-16 02:34:31 +0100
committerMatthias Schiffer <matthias@gamezock.de>2010-03-16 02:34:31 +0100
commit98ae7f48c5c041cad0ffebe3793b0c74e8378512 (patch)
tree24d9dc4a52cc42c8eaf521daf194ebeb21e4acb0
parent90b8d87e02bfb0d1d3d10c3b824df8fd8ce37a9f (diff)
downloadhtanks-98ae7f48c5c041cad0ffebe3793b0c74e8378512.tar
htanks-98ae7f48c5c041cad0ffebe3793b0c74e8378512.zip
Added bullet/bullet collision
-rw-r--r--src/Collision.hs10
-rw-r--r--src/Simulation.hs20
2 files changed, 25 insertions, 5 deletions
diff --git a/src/Collision.hs b/src/Collision.hs
index 84227d4..fad7cd6 100644
--- a/src/Collision.hs
+++ b/src/Collision.hs
@@ -1,7 +1,9 @@
module Collision ( collisionTankBorder
+ , collisionBulletBullet
) where
import Tank
+import Game
import Data.Fixed
import Data.Ratio
@@ -12,6 +14,9 @@ tankWidth = 0.95
tankLength :: Micro
tankLength = 0.95
+bulletDiameter :: Micro
+bulletDiameter = 0.2
+
collisionTankBorder :: Micro -> Micro -> Tank -> Tank
collisionTankBorder lw lh tank = tank {tankX = newx, tankY = newy}
where
@@ -39,3 +44,8 @@ collisionTankBorder lw lh tank = tank {tankX = newx, tankY = newy}
newx = (tankX tank) + dx
newy = (tankY tank) + dy
+
+collisionBulletBullet :: (Bullet, Bullet) -> (Bullet, Bullet) -> Bool
+collisionBulletBullet (b1, b1') (b2, b2') = distancesq < (bulletDiameter^2)
+ where
+ distancesq = (bulletX b1' - bulletX b2')^2 + (bulletY b1' - bulletY b2')^2 \ No newline at end of file
diff --git a/src/Simulation.hs b/src/Simulation.hs
index 65dc668..a1c193f 100644
--- a/src/Simulation.hs
+++ b/src/Simulation.hs
@@ -121,12 +121,22 @@ simulationStep = do
modify $ \state -> state {players = p}
lift $ modify $ \state ->
- let thebullets = map (runState $ updateBullet state) $ newbullets ++ bullets state
- thetanks = map (\(tank, n) -> tank {tankBulletsLeft = (tankBulletsLeft tank) + (countLostTankBullets n thebullets)}) $ zip newtanks [0..]
- in state {tanks = thetanks, bullets = map snd . filter fst $ thebullets}
+ let thebullets = map (runState $ updateBullet state) $ bullets state
+ leftbullets = collideBullets $ zipWith (\(left, bullet') bullet -> (left, bullet, bullet')) thebullets $ bullets state
+ thetanks = map (\(tank, n) -> tank {tankBulletsLeft = (tankBulletsLeft tank) + (countLostTankBullets n leftbullets)}) $ zip newtanks [0..]
+ in state {tanks = thetanks, bullets = newbullets ++ (map snd . filter fst $ leftbullets)}
+
where
- updateTank' game (player, tank) = let (p, angle, move, aangle, bullet) = playerUpdate player tank
+ collideBullets [] = []
+ collideBullets ((left, bullet, bullet'):bs) = let (c, ls) = collideBullet bullet bullet' bs
+ in (left && not c, bullet'):(collideBullets ls)
+ collideBullet bullet bullet' bs = let cs = map (\(left, b, b') -> (left, collisionBulletBullet (bullet, bullet') (b, b'), b, b')) bs
+ collided = any (\(_,c,_,_) -> c) cs
+ left = map (\(left, c, b, b') -> (left && not c, b, b')) $ cs
+ in (collided, left)
+
+ updateTank' game (player, tank) = let (p, angle, move, aangle, shoot) = playerUpdate player tank
t = execState (updateTank game angle move aangle) tank
- in (p, t, bullet)
+ in (p, t, shoot)
countLostTankBullets n (x:xs) = (if ((not . fst $ x) && (n == (bulletTank . snd $ x))) then 1 else 0) + (countLostTankBullets n xs)
countLostTankBullets n [] = 0