From 335c10654f7d41053ffcabed19cb003d1c0ce13e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 8 Mar 2010 22:13:35 +0100 Subject: Added bullet texture and movement; restructured game state --- HTanks.hs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'HTanks.hs') diff --git a/HTanks.hs b/HTanks.hs index c75aba2..7c648c1 100644 --- a/HTanks.hs +++ b/HTanks.hs @@ -3,7 +3,6 @@ import Game import Level import Render -import Tank import Player import CPUPlayer import DefaultPlayer @@ -45,12 +44,12 @@ main = do when (initialized gl) $ do currentTime <- getCurrentTime let mainState = MainState {run = True, driver = SomeDriver gl, time = currentTime, players = - [ SomePlayer $ DefaultPlayer S.empty 0 0 + [ SomePlayer $ DefaultPlayer S.empty 0 0 False , SomePlayer $ CPUPlayer 0 ]} - gameState = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 2 270 False - , Tank 5.0 3.5 0 0 2 270 False - ], textures = M.empty} + gameState = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 2 270 False 3 2 + , Tank 5.0 3.5 0 0 2 270 False 3 2 + ], shoots = [], textures = M.empty} runGame gameState $ do setup @@ -148,6 +147,14 @@ updateTank angle move aangle = do modify $ \tank -> tank {moving = False} +updateShoot :: State Shoot () +updateShoot = modify $ \shoot -> + let angle = (fromRational . toRational . shootDir $ shoot)*pi/180 + dx = (shootSpeed shoot) * fromRational (round ((cos angle)*1000)%1000000) + dy = (shootSpeed shoot) * fromRational (round ((sin angle)*1000)%1000000) + in shoot {shootX = dx + shootX shoot, shootY = dy + shootY shoot} + + simulationStep :: Main () simulationStep = do oldplayers <- gets players @@ -156,9 +163,9 @@ simulationStep = do let pt = unzip $ map updateTank' $ zip oldplayers oldtanks modify $ \state -> state {players = fst pt} - lift $ modify $ \state -> state {tanks = snd pt} + lift $ modify $ \state -> state {tanks = snd pt, shoots = map (execState updateShoot) $ shoots state} where - updateTank' (player, tank) = let (p, angle, move, aangle) = playerUpdate player tank + updateTank' (player, tank) = let (p, angle, move, aangle, shoot) = playerUpdate player tank t = execState (updateTank angle move aangle) tank in (p, t) -- cgit v1.2.3