Reflect bullets at the level border
This commit is contained in:
parent
89e87826a8
commit
4993b2ef07
2 changed files with 32 additions and 23 deletions
|
@ -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
|
||||
|
|
Reference in a new issue