Collision handle event question [SOLVED]

Hello all,

I’m still trying to understand the collisions hadler events… Yes!!! I didn’t give up :slight_smile: … Hum!.. Sorry!! So…
I tried to simplify an exemple of the manual and I can’t figure where’s my error…

import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject
from direct.interval.IntervalGlobal import *

class World(DirectObject):
    def __init__(self):
        self.cry = loader.loadModel('smiley')
        self.cry.reparentTo(camera)
        self.cry.setPos(0,25,0)
        
        self.smile = loader.loadModel('smiley')
        self.smile.reparentTo(render)
        self.smile.setPos(5,25,0)
        
        self.colHandEvent=CollisionHandlerEvent()
        self.colHandEvent.addInPattern('into-%in')
        self.colHandEvent.addOutPattern('outof-%in')


        #events for self.cry
        self.cryNode = CollisionNode('cryCS')
        self.cryNode.addSolid(CollisionSphere(0,0,0,1.5))
        self.cryCS= self.cry.attachNewNode(self.cryNode)
        self.cryCS.show()

        CollisionTraverser().addCollider(self.cryCS, self.colHandEvent)
        self.accept( 'into-' + 'cryCS', self.inCollideSmile)
        self.accept( 'outof-' + 'cryCS', self.outCollideSmile)

        #And now, for self.smile
        self.smileNode= CollisionNode('smileCS')
        self.smileNode.addSolid(CollisionSphere(0,0,0,1.5))
        self.smileCS= self.smile.attachNewNode(self.smileNode)
        self.smileCS.show()

        CollisionTraverser().addCollider(self.smileCS, self.colHandEvent)
        self.accept( 'into-' + 'smileCS', self.inCollideCry)
        self.accept( 'outof-' + 'smileCS', self.outCollideCry)

    def inCollideSmile(self, collEntry):
        print "it's working"
    def outCollideSmile(self, collEntry):
        print "or maybe not working"
        
    def inCollideCry(self, collEntry):
        print "OKAY! It's defently not working"
    def outCollideCry(self, collEntry):
        print "Grrr!! What's wrong?"

w= World()
run()

1st: you seems to be creating several collision traversers.
unless you really want to do so you should create one. and add colliders to it.
like

cTrav = CollisionTraverser()
cTrac.addCollider(self.smileCS, self.colHandEvent) 

you also need to call traverse() (here it would be cTrav.traverse() ) to do the actual collision detection.
just what i see from here right now. i havent messed with collisions in a wrong time so i might remember some thing wrong.

The exemple wrote above is supposed to be used within many classes… So, you’re bringing up a question that I’m already self-asking :
1 - Should there be one and only one traverser for all objects ?
In this case, it shall behave like the task manager
OR
2- Should each object have it’s own traverser ?

Euh, ok… But I only tried to follow this exemple where there is no call to cTrav.traverse()
panda3d.org/manual/index.php/Event_Example

I’m still searching for exemples where traverser and event handler are being used within many classes… But if someone can point to the error of the code above, that would be a great start :slight_smile:

Regs :wink:

Thomas words just bouced in my head and now it’s clearer.
Here’s the code corrected and working :

import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject
from direct.interval.IntervalGlobal import *

class World(DirectObject):
    def __init__(self):
        self.cry = loader.loadModel('smiley')
        self.cry.reparentTo(camera)
        self.cry.setPos(0,25,0)
        
        self.smile = loader.loadModel('smiley')
        self.smile.reparentTo(render)
        self.smile.setPos(5,25,0)

        base.cTrav = CollisionTraverser()
        self.colHandEvent=CollisionHandlerEvent()
        self.colHandEvent.addInPattern('into-%in')
        self.colHandEvent.addOutPattern('outof-%in')

        self.cryNode = CollisionNode('cryCS')
        self.cryNode.addSolid(CollisionSphere(0,0,0,1.5))
        self.cryCS= self.cry.attachNewNode(self.cryNode)
        self.cryCS.show()

        base.cTrav.addCollider(self.cryCS, self.colHandEvent)
        self.accept( 'into-' + 'cryCS', self.inCollideSmile)
        self.accept( 'outof-' + 'cryCS', self.outCollideSmile)

        self.smileNode= CollisionNode('smileCS')
        self.smileNode.addSolid(CollisionSphere(0,0,0,1.5))
        self.smileCS= self.smile.attachNewNode(self.smileNode)
        self.smileCS.show()

        base.cTrav.addCollider(self.smileCS, self.colHandEvent)
        self.accept( 'into-' + 'smileCS', self.inCollideCry)
        self.accept( 'outof-' + 'smileCS', self.outCollideCry)

    def inCollideSmile(self, collEntry):
        print "it's working"
    def outCollideSmile(self, collEntry):
        print "or maybe not working"
        
    def inCollideCry(self, collEntry):
        print "OKAY! It's defently not working"
    def outCollideCry(self, collEntry):
        print "Grrr!! What's wrong?"

w= World()
run()