Hi,
I have got a Problem. I have got an ExplosionClass which shall be completly removed from the game after the animation.
I don’t realy know why the Effect is still processed, so the game slows down after 10-15 Explosions ( which are not at the same time, but every 10 secs, so it is not just a temporal problem. It is constant )
The Explosion itself consists of 3 Fireballs and a Smoke ParticleSystem
The FireBall
class FireBall(DirectObject):
def __init__(self):
self.addTask(self.updateTask,"updateExplosionTask")
self.dummy = render.attachNewNode("dummy")
base.enableParticles()
self.p = ParticleEffect()
self.p.loadConfig(Filename("particles/fire_stream.ptf"))
self.particleRenderNode = render.attachNewNode("expNode")
self.effectTime = 500
self.vec = Vec3(0,0,0)
self.p.start(self.dummy, self.particleRenderNode)
def setDirection(self,x,y,z):
self.vec.setX(x)
self.vec.setY(y)
self.vec.setZ(z)
def setPos(self, obj):
self.dummy.setPos(obj)
self.dummy.setZ(self.dummy.getZ()+10)
def updateTask(self, task):
elapsed = globalClock.getDt()
self.effectTime -= elapsed*50
self.vec.setZ(self.vec.getZ()-elapsed*10)
self.dummy.setPos(self.dummy.getPos()+self.vec)
if self.effectTime <= 0:
self.p.softStop()
self.p.remove()
self.ignoreAll()
return Task.done
return Task.cont
The Explosion
class Explosion2(DirectObject):
def __init__(self):
self.file = ""
print dir(self)
self.audio3d = None
self.expSound = None
self.addTask(self.updateTask,"updateExplosionTask")
self.cTrav = CollisionTraverser()
self.expSphere = CollisionSphere(0,0,0,1)
self.expCol = CollisionNode('explosionSphere')
self.expCol.addSolid(self.expSphere)
self.expCol.setFromCollideMask(BitMask32.bit(1))
self.expCol.setIntoCollideMask(BitMask32.allOff())
self.expColNp = render.attachNewNode(self.expCol)
self.expColNp.setPythonTag("object", self)
self.expHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.expColNp, self.expHandler)
print dir(self.cTrav)
self.effectTime = 50
self.expTime = 10
self.damage = 100
self.looseFac = 0
self.size= 100
self.load_file(self.file)
self.p4 = ParticleEffect()
self.p4.loadConfig(Filename("particles/explo_dust.ptf"))
self.particleRenderNode = render.attachNewNode("expNode")
self.p4.start(self.expColNp, self.particleRenderNode)
self.p = FireBall()
self.p.dummy.reparentTo(self.expColNp)
self.p.setDirection(random.randint(0,5)-2.5,random.randint(0,5)-2.5,random.randint(0,5))
self.p2 = FireBall()
self.p2.dummy.reparentTo(self.expColNp)
self.p2.setDirection(random.randint(0,5)-2.5,random.randint(0,5)-2.5,random.randint(0,5))
self.p3 = FireBall()
self.p3.dummy.reparentTo(self.expColNp)
self.p3.setDirection(random.randint(0,5)-2.5,random.randint(0,5)-2.5,random.randint(0,5))
def setPos(self, obj):
self.expColNp.setPos(obj)
def load_file(self, filename):
if filename:
self.file = filename
f = file(filename)
buffer = f.readlines()
if self.audio3d:
self.expSound = self.audio3d.loadSfx(buffer[0][:-1])
self.audio3d.attachSoundToObject(self.expSound, NodePath(self.model))
for i in buffer[1:]:
l = i.split(" ")
setattr(self, l[0], float(l[1]))
def calcDamage(self):
return self.damage / self.expSphere.getRadius()
def updateTask(self, task):
elapsed = globalClock.getDt()
self.expSphere.setRadius(self.expSphere.getRadius()+elapsed*self.size)
self.effectTime -= elapsed*50
self.expTime -= elapsed*50
self.cTrav.traverse(render)
entries = []
for i in range(self.expHandler.getNumEntries()):
entry = self.expHandler.getEntry(i)
entries.append(entry)
entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
x.getSurfacePoint(render).getZ()))
if len(entries) > 0:
obj = entries[0].getIntoNode()
what = entries[0].getIntoNode().getName()
if obj :
if what == "playerSphereTrigger":
obj.getPythonTag("player").hit(self.calcDamage(), "Explosion", "Explosion")
if self.expTime <= 0:
self.cTrav.removeCollider(self.expColNp)
self.expColNp.remove()
if self.effectTime <= 0:
self.ignoreAll()
self.p4.softStop()
self.p4.remove()
return Task.done
return Task.cont
I realy need help for this else I can just have around 5 Explosions in the whole game.
Thanks in advance
blenderkid