I have a tube with over 1000 rocks and one penguin sliding down it. I use one traverser for the penguin hitting all the rocks. I am aware of the limit on the amount of objects a traverser can handle, but (unless I am mistaken) the limit only applies to “from” objects.
Anyway, the code works great until you hit a certain point in the tunnel. Then it stops working for a bit. Then, confusingly, it starts working again. The locations are not random…it always stops and starts working in the same place. The rocks and collision spheres that don’t “collide” with the penguin are still being generated, because I can see them when I run the program…so I dont understand the problem.
Below is the relevant code:
def exposeJoints(self, task):
# for each rock, we need to expose the joint, and create a collision sphere at the pos of the joint
for i in range (1,744):
rockName = "Rocks1:r" + str(i)
self.rockJoint = self.tube.exposeJoint(None,"modelRoot",rockName )
self.rockModel = Actor.Actor("models/Ice2.egg", {'shatter' : "models/Ice2-Shatter"} )
self.rock = Rock(self.rockJoint, self.rockModel, i, self)
self.rocks[i] = self.rock
return Task.done
class Penguin(DirectObject):
def __init__(self, model, w):
self.model = model
self.model.reparentTo(w.penguinDummy)
self.model.setPos(0,10,-5)
self.model.setScale(.4)
self.invincible = False
self.alreadyCollided = False
self.jumping = False
self.enableControl = False
# create a collision segment coming out of the penguin's front
self.penguinSeg = CollisionSegment(0,0,1,0,15,0)
self.penguinSegNodePath = self.model.attachNewNode(CollisionNode('penguinColSeg') )
self.penguinSegNodePath.node().addSolid(self.penguinSeg)
self.penguinSegNodePath.show()
# collision segment comint out of the penguin's bottom (for pits)
self.penguinPitSeg = CollisionSegment(0,0,1,0,0,-9)
self.penguinPitSegNodePath = self.model.attachNewNode(CollisionNode('penguinPitColSeg') )
self.penguinPitSegNodePath.node().addSolid(self.penguinSeg)
self.penguinPitSegNodePath.show()
# set up collision traverser
self.traverser = CollisionTraverser('penguinTraverser')
base.cTrav = self.traverser
# initialize collision handler
self.collisionHandler = CollisionHandlerEvent()
# check if the from object hit any node
self.collisionHandler.addAgainPattern('%fn-again-%in')
for i in range (1, 500):
if (w.rocks.has_key(i)):
string = 'penguinColSeg-again-rock'+str(i)
self.accept(string, w.rocks[i].collide, [w.rocks[i], w])
if (w.spikes.has_key(i)):
self.accept('penguinColSeg-again-spike'+str(i), w.spikes[i].collide, [w.spikes[i], w])
# add the collision node path and the handler to the traverser
self.traverser.addCollider(self.penguinSegNodePath, self.collisionHandler)
# end init
class Rock(DirectObject):
def __init__(self, joint, model, num, w):
self.model = model
self.num = num
self.joint = joint
self.model.reparentTo(self.joint)
self.rockSphere = CollisionSphere(0, 0, 0, 1.5)
self.rockSphereNodePath = self.model.attachNewNode(CollisionNode('rock'+str(self.num) ) )
self.rockSphereNodePath.node().addSolid(self.rockSphere)
self.rockSphereNodePath.show()
At first I thought maybe the penguin’s speed was causing the problem at that point in the tunnel, so I slowed down his speed to a crawl, and I get the exact same problem.
Any ideas?
Thanks in advance,
Adam