I have a problem here, when the sphereNode of the first fire hits the level surface and the function hitLevel is called, self.plnp.removeNode() removes all the lights (fire) added to self.fireList. I can’t figure out what is happening.
playerNode = render.attachNewNode("PLAYER")
levelTrav = CollisionTraverser()
fireHandler = CollisionHandlerEvent()
fireHandler.addInPattern('into-%in')
class fire(DirectObject.DirectObject):
def __init__(self, index):
plight = PointLight('plight%03d' % index)
plight.setColor(Vec4(1, 1, 1, 1))
plight.setAttenuation(Vec3(0.7, 0.5, 0))
self.plnp = playerNode.attachNewNode(plight)
self.plnp.setPos(0, -0.3, 0)
render.setLight(self.plnp)
sphere = CollisionNode('fireSphere%03d' % index)
sphere.addSolid(CollisionSphere(0,0, 0.8, 0.2))
sphereNode = self.plnp.attachNewNode(sphere)
sphereNode.show()
levelTrav.addCollider(sphereNode, fireHandler)
self.accept('into-terrain', self.__hitLevel__)
def __hitLevel__(self, entry):
self.plnp.removeNode()
def shoot(self):
pos = self.plnp.getPos()
self.plnp.posInterval(1.3,
(pos.getX()+10, pos.getY(), pos.getZ()), startPos=pos).start()
class player(DirectObject.DirectObject):
def __init__(self):
self.fireList = []
self.accept('mouse1', self.__fire__)
def __fire__(self):
if len(self.fireList)<3:
self.fireList.append(fire(len(self.fireList)))
self.fireList[-1].shoot()
Also, if I shoot five fires my feetSegment stops detecting levelSurface and player falls eternally, I have a task that updates player Z coordinate.
# segment that detects level surface
feetSegment = CollisionNode('feetSegment')
feetSegment.addSolid(CollisionSegment(0, 0, 0, 0, 0, -0.25))
feetSegment.setIntoCollideMask(BitMask32.bit(0))
feetNode = playerNode.attachNewNode(feetSegment)
feetNode.show()
colTrav.addCollider(feetNode, colHandler)
self.accept('feetSegment-into-terrain', self.__hitTheGround__)
self.accept('feetSegment-outof-terrain', self.__falling__)