Renamed shoot to bullet
This commit is contained in:
parent
7327695ca3
commit
89e87826a8
3 changed files with 36 additions and 36 deletions
24
src/Game.hs
24
src/Game.hs
|
@ -1,7 +1,7 @@
|
||||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||||
|
|
||||||
module Game ( Tank(..)
|
module Game ( Tank(..)
|
||||||
, Shoot(..)
|
, Bullet(..)
|
||||||
, GameState(..)
|
, GameState(..)
|
||||||
, Game
|
, Game
|
||||||
, runGame
|
, runGame
|
||||||
|
@ -24,24 +24,24 @@ data Tank = Tank
|
||||||
, tankSpeed :: !Micro
|
, tankSpeed :: !Micro
|
||||||
, tankTurnspeed :: !Micro
|
, tankTurnspeed :: !Micro
|
||||||
, tankMoving :: !Bool
|
, tankMoving :: !Bool
|
||||||
, tankShootSpeed :: !Micro
|
, tankBulletSpeed :: !Micro
|
||||||
, tankShootBounces :: !Int
|
, tankBulletBounces :: !Int
|
||||||
, tankShootsLeft :: !Int
|
, tankBulletsLeft :: !Int
|
||||||
} deriving Show
|
} deriving Show
|
||||||
|
|
||||||
data Shoot = Shoot
|
data Bullet = Bullet
|
||||||
{ shootX :: !Micro
|
{ bulletX :: !Micro
|
||||||
, shootY :: !Micro
|
, bulletY :: !Micro
|
||||||
, shootDir :: !Micro
|
, bulletDir :: !Micro
|
||||||
, shootSpeed :: !Micro
|
, bulletSpeed :: !Micro
|
||||||
, shootBouncesLeft :: !Int
|
, bulletBouncesLeft :: !Int
|
||||||
, shootTank :: !Int
|
, bulletTank :: !Int
|
||||||
} deriving Show
|
} deriving Show
|
||||||
|
|
||||||
data GameState = GameState
|
data GameState = GameState
|
||||||
{ level :: !Level
|
{ level :: !Level
|
||||||
, tanks :: ![Tank]
|
, tanks :: ![Tank]
|
||||||
, shoots :: ![Shoot]
|
, bullets :: ![Bullet]
|
||||||
, textures :: !(M.Map Texture TextureObject)
|
, textures :: !(M.Map Texture TextureObject)
|
||||||
} deriving (Show)
|
} deriving (Show)
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ main = do
|
||||||
]}
|
]}
|
||||||
gameState = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 2 270 False 3 2 5
|
gameState = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 2 270 False 3 2 5
|
||||||
, Tank 5.0 3.5 0 0 2 270 False 3 2 5
|
, Tank 5.0 3.5 0 0 2 270 False 3 2 5
|
||||||
], shoots = [], textures = M.empty}
|
], bullets = [], textures = M.empty}
|
||||||
|
|
||||||
runGame gameState $ do
|
runGame gameState $ do
|
||||||
setup
|
setup
|
||||||
|
@ -147,14 +147,14 @@ updateTank angle move aangle = do
|
||||||
modify $ \tank -> tank {tankMoving = False}
|
modify $ \tank -> tank {tankMoving = False}
|
||||||
|
|
||||||
|
|
||||||
updateShoot :: State Shoot ()
|
updateBullet :: State Bullet ()
|
||||||
updateShoot = do
|
updateBullet = do
|
||||||
angle <- gets shootDir >>= return . (/180) . (*pi) . fromRational . toRational
|
angle <- gets bulletDir >>= return . (/180) . (*pi) . fromRational . toRational
|
||||||
speed <- gets shootSpeed
|
speed <- gets bulletSpeed
|
||||||
let dx = speed * fromRational (round ((cos angle)*1000)%1000000)
|
let dx = speed * fromRational (round ((cos angle)*1000)%1000000)
|
||||||
dy = speed * fromRational (round ((sin angle)*1000)%1000000)
|
dy = speed * fromRational (round ((sin angle)*1000)%1000000)
|
||||||
|
|
||||||
modify $ \shoot -> shoot {shootX = dx + shootX shoot, shootY = dy + shootY shoot}
|
modify $ \bullet -> bullet {bulletX = dx + bulletX bullet, bulletY = dy + bulletY bullet}
|
||||||
|
|
||||||
|
|
||||||
simulationStep :: Main ()
|
simulationStep :: Main ()
|
||||||
|
@ -164,24 +164,24 @@ simulationStep = do
|
||||||
|
|
||||||
let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks
|
let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks
|
||||||
ts = zip3 t s [0..]
|
ts = zip3 t s [0..]
|
||||||
shootingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, shoot, _) -> shoot && (tankShootsLeft tank) > 0) $ ts
|
bulletingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, bullet, _) -> bullet && (tankBulletsLeft tank) > 0) $ ts
|
||||||
newtanks = map (\(tank, shoot, _) -> if shoot then tank {tankShootsLeft = (tankShootsLeft tank) - 1} else tank) $ ts
|
newtanks = map (\(tank, bullet, _) -> if bullet then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts
|
||||||
newshoots = map (\(tank, n) -> Shoot
|
newbullets = map (\(tank, n) -> Bullet
|
||||||
{ shootX = tankX tank
|
{ bulletX = tankX tank
|
||||||
, shootY = tankY tank
|
, bulletY = tankY tank
|
||||||
, shootDir = tankAim tank
|
, bulletDir = tankAim tank
|
||||||
, shootSpeed = tankShootSpeed tank
|
, bulletSpeed = tankBulletSpeed tank
|
||||||
, shootBouncesLeft = tankShootBounces tank
|
, bulletBouncesLeft = tankBulletBounces tank
|
||||||
, shootTank = n
|
, bulletTank = n
|
||||||
}) shootingtanks
|
}) bulletingtanks
|
||||||
|
|
||||||
|
|
||||||
modify $ \state -> state {players = p}
|
modify $ \state -> state {players = p}
|
||||||
lift $ modify $ \state -> state {tanks = newtanks, shoots = map (execState updateShoot) (shoots state ++ newshoots)}
|
lift $ modify $ \state -> state {tanks = newtanks, bullets = map (execState updateBullet) (newbullets ++ bullets state)}
|
||||||
where
|
where
|
||||||
updateTank' (player, tank) = let (p, angle, move, aangle, shoot) = playerUpdate player tank
|
updateTank' (player, tank) = let (p, angle, move, aangle, bullet) = playerUpdate player tank
|
||||||
t = execState (updateTank angle move aangle) tank
|
t = execState (updateTank angle move aangle) tank
|
||||||
in (p, t, shoot)
|
in (p, t, bullet)
|
||||||
|
|
||||||
|
|
||||||
handleEvents :: Main ()
|
handleEvents :: Main ()
|
||||||
|
|
|
@ -70,7 +70,7 @@ setup = do
|
||||||
render :: Game ()
|
render :: Game ()
|
||||||
render = do
|
render = do
|
||||||
tanklist <- gets tanks
|
tanklist <- gets tanks
|
||||||
shootlist <- gets shoots
|
bulletlist <- gets bullets
|
||||||
|
|
||||||
textureWood <- getTexture TextureWood
|
textureWood <- getTexture TextureWood
|
||||||
textureTank <- getTexture TextureTank
|
textureTank <- getTexture TextureTank
|
||||||
|
@ -139,10 +139,10 @@ render = do
|
||||||
texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
|
texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
|
||||||
vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat)
|
vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat)
|
||||||
|
|
||||||
forM_ shootlist $ \shoot -> preservingMatrix $ do
|
forM_ bulletlist $ \bullet -> preservingMatrix $ do
|
||||||
let x = fromReal . shootX $ shoot
|
let x = fromReal . bulletX $ bullet
|
||||||
y = fromReal . shootY $ shoot
|
y = fromReal . bulletY $ bullet
|
||||||
rotDir = fromReal . shootDir $ shoot
|
rotDir = fromReal . bulletDir $ bullet
|
||||||
|
|
||||||
translate $ Vector3 x y (0 :: GLfloat)
|
translate $ Vector3 x y (0 :: GLfloat)
|
||||||
rotate rotDir $ Vector3 0 0 (1 :: GLfloat)
|
rotate rotDir $ Vector3 0 0 (1 :: GLfloat)
|
||||||
|
|
Reference in a new issue