packages feed

edge-0.8: AfterEffect/MineExplosion.hs

module AfterEffect.MineExplosion where

import Data.WrapAround
import Animation
import Updating
import qualified Moving as M
import Graphics.Gloss.Data.Picture
import Graphics.Gloss.Data.Color
import Sound.ALUT
import Data.Maybe
import ResourceTracker
import GHC.Float

data MineExplosion =
  MineExplosion { center :: WrapPoint
                , timeRemaining :: Double
                , soundSource :: Maybe Source
                , wrapMap :: WrapMap
                , resourceTracker :: ResourceTracker
                , animClock :: Double
                }

new :: ResourceTracker -> WrapMap -> WrapPoint -> MineExplosion
new rt wmap center' =
  MineExplosion { center = center'
                , timeRemaining = 3.0
                , soundSource = Nothing
                , wrapMap = wmap
                , resourceTracker = rt
                , animClock = 0.0
                }

instance Animation MineExplosion where
  image self t =
    let dFrame = Color white (Scale 0.10 0.10 (Text "boom!")) in
    let rt = resourceTracker self in
    let at = animClock self in
    if at < 0.1 then fromMaybe dFrame $ getImage rt "mine-explosion.bmp"
    else Blank

instance M.Locatable MineExplosion where
  center = center

instance Transient MineExplosion where

  expired' self = if timeRemaining self <= 0.0
                    then Just []
                    else Nothing

instance InternallyUpdating MineExplosion where

  preUpdate self t = self { timeRemaining = timeRemaining self - t }

  postUpdate self t = self { animClock = animClock self + t }

instance Audible MineExplosion where

  processAudio self lcenter =
    if isNothing (soundSource self)
      then do self' <- initializeSoundSource self
              let (x, y) = vectorRelation
                                      (wrapMap self')
                                      (lcenter)
                                      (center self')
              let s = fromJust $ soundSource self'
              sourcePosition s $= (Vertex3 (double2Float x)
                                           (double2Float (-y))
                                           0)
              play [s]
              return self'
      else return self

  terminateAudio self =
    if isNothing (soundSource self)
      then return self
      else do stop [fromJust (soundSource self)]
              return self

initializeSoundSource self =
  do [source] <- genObjectNames 1
     buffer source $= getSound (resourceTracker self) "explosion.wav"
     sourceRelative source $= Listener
     referenceDistance source $= audioReferenceDistance
     rolloffFactor source $= audioRolloffFactor
     sourceGain source $= 0.5
     return self { soundSource = Just source }