Reflect bullets at the level border

This commit is contained in:
Matthias Schiffer 2010-03-09 06:45:02 +01:00
parent 89e87826a8
commit 4993b2ef07
2 changed files with 32 additions and 23 deletions

View file

@ -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)
x = dx + bulletX bullet
y = dy + bulletY bullet
lw = fromIntegral . levelWidth . level $ game
lh = fromIntegral . levelHeight . level $ game
dir = bulletDir bullet
modify $ \bullet -> bullet {bulletX = dx + bulletX bullet, bulletY = dy + bulletY 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 ()
@ -177,7 +186,7 @@ simulationStep = do
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