diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2010-03-16 02:34:31 +0100 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2010-03-16 02:34:31 +0100 |
commit | 98ae7f48c5c041cad0ffebe3793b0c74e8378512 (patch) | |
tree | 24d9dc4a52cc42c8eaf521daf194ebeb21e4acb0 | |
parent | 90b8d87e02bfb0d1d3d10c3b824df8fd8ce37a9f (diff) | |
download | htanks-98ae7f48c5c041cad0ffebe3793b0c74e8378512.tar htanks-98ae7f48c5c041cad0ffebe3793b0c74e8378512.zip |
Added bullet/bullet collision
-rw-r--r-- | src/Collision.hs | 10 | ||||
-rw-r--r-- | src/Simulation.hs | 20 |
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 |