Add new smoke module
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
module Dodge.WorldEvent.Smoke
|
||||||
|
where
|
||||||
|
import Dodge.Data
|
||||||
|
import Dodge.Base
|
||||||
|
|
||||||
|
import Picture
|
||||||
|
import Geometry
|
||||||
|
|
||||||
|
import Control.Lens
|
||||||
|
|
||||||
|
import qualified Data.IntMap.Strict as IM
|
||||||
|
|
||||||
|
makeColorSmokeAt :: Color -> Point2 -> Float -> Int -> Point2 -> World -> World
|
||||||
|
makeColorSmokeAt col vel scal time p w = over projectiles (IM.insert n smP) w
|
||||||
|
where n = newProjectileKey w
|
||||||
|
smP = Projectile
|
||||||
|
{ _ptPos = p
|
||||||
|
, _ptStartPos = p
|
||||||
|
, _ptVel = vel
|
||||||
|
, _ptPict = setLayer 2 . setDepth 0 . uncurry translate p $ color col $ circleSolid 1
|
||||||
|
, _ptID = n
|
||||||
|
, _ptUpdate = moveColorSmoke col scal time n
|
||||||
|
}
|
||||||
|
|
||||||
|
moveColorSmoke :: Color -> Float -> Int -> Int -> World -> World
|
||||||
|
moveColorSmoke col scal time i w
|
||||||
|
| time > 0
|
||||||
|
= set (projectiles . ix i . ptPict) pic
|
||||||
|
. set (projectiles . ix i . ptUpdate) (moveColorSmoke col scal (time-1) i)
|
||||||
|
. set (projectiles . ix i . ptPos) newPos
|
||||||
|
. setVel
|
||||||
|
$ w
|
||||||
|
| time > -50
|
||||||
|
= set (projectiles . ix i . ptPict) pi1
|
||||||
|
. set (projectiles . ix i . ptUpdate) (moveColorSmoke col scal (time-1) i)
|
||||||
|
. set (projectiles . ix i . ptPos) newPos
|
||||||
|
. setVel
|
||||||
|
$ w
|
||||||
|
| otherwise
|
||||||
|
= over projectiles (IM.delete i) w
|
||||||
|
where oldPos = _ptPos $ _projectiles w IM.! i
|
||||||
|
newPos = oldPos +.+ (_ptVel $ _projectiles w IM.! i)
|
||||||
|
setVel = over (projectiles . ix i . ptVel) $ (*.*) 0.99
|
||||||
|
pic = setLayer 2 . setDepth 0 . uncurry translate newPos $ color col $ circleSolid $ (21 - fromIntegral time) * scal
|
||||||
|
pi1 = setLayer 2 . setDepth 0 . uncurry translate newPos
|
||||||
|
$ color (withAlpha (1 + fromIntegral time /50) col)
|
||||||
|
$ circleSolid $ 21 * scal
|
||||||
Reference in New Issue
Block a user