Good day, sirs and ladies.
Working in a project with JuanReyes and Arbosis, I had to detect some troubles in this code:
from direct.showbase.ShowBase import ShowBase
from direct.showbase import DirectObject
from pandac.PandaModules import *
from panda3d.core import CollisionTraverser,CollisionNode,CollisionHandler #TESTING
from direct.interval.IntervalGlobal import *
from direct.task import Task
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
#to load animations of photos
from textureMovie import *
# explosion follow camera
from panda3d.core import BillboardEffect
import profile
class projectile(DirectObject.DirectObject):
def __init__(self, level_, startPos_, duration_, startVel_):
self.name = str(globalClock.getFrameCount())
self.level = level_
self.node = NodePath('projectile'+self.name)
self.node.reparentTo(render)
self.nodeModel = self.node.attachNewNode("rocketModel")
profile.SuperModels().getModel("smiley").instanceTo(self.nodeModel)
self.nodeModel.setScale(0.3)
self.nodeModel.reparentTo(self.node)
self.collisionHandler = 0
self.traverser = 0
self.explo = 0
self.createCollisions()
self.trajectory = ProjectileInterval(self.node,
startPos = startPos_,
duration = duration_, startVel = startVel_,
gravityMult=0.000000001)
#Plays Shoot SFX
self.SoundFX = loader.loadSfx('../sfx/gunshots/fireshot.wav')
self.SoundFX.setLoop(False)
self.SoundFX.play()
self.setupEvents()
self.trajectory.setDoneEvent("killProjectile" + self.name)
self.trajectory.start()
def createCollisions(self):
self.traverser = CollisionTraverser('traverser')
self.traverser.showCollisions(render)
self.cNode = CollisionNode('projectile')
self.cNode.addSolid(CollisionSphere(0,0,0,0.5))
self.cNode.setCollideMask(BitMask32(0x10))
self.cNodePath = self.node.attachNewNode(self.cNode)
self.collisionHandler = CollisionHandlerEvent()
self.collisionHandler.addInPattern('projectileHit' + self.name)
base.cTrav.addCollider(self.cNodePath, self.collisionHandler)
def setupEvents(self):
self.accept("killProjectile" + self.name, self.killProjectile)
self.accept("projectileHit" + self.name, self.hitEvent)
def hitEvent(self,entry):
impactedNode = entry.getIntoNodePath().getParent();
if impactedNode.getTag("enemy") == "hola":
for i in self.level.enemyList:
if i.node == impactedNode:
if i.state == "Damaged":
i.request("Die")
else:
i.request("Damaged")
break
self.killProjectile()
def killProjectile(self):
self.trajectory.pause()
self.nodeModel.remove()
self.pef = ParticleEffect()
self.pef.loadConfig(Filename("models/fireish.ptf"))
self.pef.start(self.node)
self.smoke = ParticleEffect()
self.smoke.loadConfig(Filename("models/smoke.ptf"))
self.smoke.start(self.node)
taskMgr.doMethodLater(1,self.killExplosion,"killExplosionTask"+str(id(self.node)))
taskMgr.doMethodLater(3,self.killSmoke,"killSmokeTask"+str(id(self.node)))
def killExplosion(self,task):
self.pef.disable()
return Task.done
def killSmoke(self,task):
self.smoke.disable()
self.node.removeNode()
self.nodeModel.removeNode()
return Task.done
Basically, it is a Projectile system. When I press the shoot button, it shoots, no problem. But, if I shoot too much, it lags has hell. Reasons, 2:
-
Okay, too much particles may lag the system graphically, that’s comprehensible.
-
Too much particles turn the system Laggy, even when particle effects were removed.
So, the question is… “Where am I failing?”. I still can’t detect which thing is wrong. I partially made it to get less laggy because I wasn’t removing the Children from the nodeModel, but even so the cumulative lag keeps in there.
help please.