75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
from panda3d.core import *
|
|
from direct.interval.IntervalGlobal import *
|
|
from EffectController import EffectController
|
|
from PooledEffect import PooledEffect
|
|
from toontown.effects.SparksTrailLong import SparksTrailLong
|
|
import random
|
|
|
|
class TrailExplosion(PooledEffect, EffectController):
|
|
trailsVel = [[Vec3(150, -50, 100), Vec3(-150, -50, 100), Vec3(0, 150, 100)], [Vec3(120, 120, 100),
|
|
Vec3(120, -120, 100),
|
|
Vec3(-120, 120, 100),
|
|
Vec3(-120, -120, 100)], [Vec3(0, 150, 100),
|
|
Vec3(140, 30, 100),
|
|
Vec3(-140, 30, 100),
|
|
Vec3(30, -60, 100),
|
|
Vec3(-30, -60, 100)]]
|
|
|
|
def __init__(self):
|
|
PooledEffect.__init__(self)
|
|
EffectController.__init__(self)
|
|
self.effectScale = 1.0
|
|
self.effectColor = Vec4(1, 1, 1, 1)
|
|
self.numTrails = 5
|
|
self.trails = []
|
|
self.trailEffects = []
|
|
self.trailIval = Parallel()
|
|
|
|
def createTrack(self):
|
|
self.trails = []
|
|
self.trailEffects = []
|
|
self.trailIval = Parallel()
|
|
vels = None
|
|
if self.numTrails >= 3 and self.numTrails <= 5:
|
|
vels = self.trailsVel[self.numTrails - 3]
|
|
for i in xrange(self.numTrails):
|
|
self.trails.append(self.attachNewNode('trail'))
|
|
vel = Vec3(0, 0, 0)
|
|
if vels:
|
|
vel = Vec3(vels[i][0] + random.randint(-20, 20), vels[i][1] + random.randint(-20, 20), vels[i][2] + random.randint(0, 50))
|
|
else:
|
|
vel = Vec3(random.randint(-200, 200), random.randint(-200, 200), random.randint(80, 150))
|
|
vel *= self.effectScale
|
|
dur = 2.0 + random.random() / 4.0
|
|
self.trailIval.append(ProjectileInterval(self.trails[i], startVel=vel, duration=dur, gravityMult=0.6))
|
|
self.trailEffects.append(SparksTrailLong.getEffect())
|
|
if self.trailEffects[i]:
|
|
self.trailEffects[i].reparentTo(self.trails[i])
|
|
self.trailEffects[i].setLifespan(2.0)
|
|
self.trailEffects[i].setEffectColor(self.effectColor)
|
|
self.trailEffects[i].setEffectScale(self.effectScale)
|
|
self.trailIval.append(Sequence(Func(self.trailEffects[i].startLoop), Wait(dur), Func(self.trailEffects[i].stopLoop)))
|
|
|
|
self.track = Sequence(self.trailIval, Func(self.cleanUpEffect))
|
|
return
|
|
|
|
def setEffectScale(self, scale):
|
|
self.effectScale = scale
|
|
|
|
def setEffectColor(self, color):
|
|
self.effectColor = color
|
|
|
|
def cleanUpEffect(self):
|
|
for effect in self.trailEffects:
|
|
if effect:
|
|
effect.stopLoop()
|
|
effect = None
|
|
|
|
EffectController.cleanUpEffect(self)
|
|
if self.pool and self.pool.isUsed(self):
|
|
self.pool.checkin(self)
|
|
return
|
|
|
|
def destroy(self):
|
|
EffectController.destroy(self)
|
|
PooledEffect.destroy(self)
|