Event Example

Here is a short example of using the Collision Handler Events:

 1from direct.showbase.ShowBase import ShowBase  2from direct.showbase.DirectObject import DirectObject  3from direct.interval.IntervalGlobal import Sequence, Func, Wait  4from panda3d.core import CollisionTraverser, CollisionHandlerEvent  5from panda3d.core import CollisionNode, CollisionSphere  6  7  8class World(DirectObject):  9  10 def __init__(self):  11 # Initialize the traverser.  12 base.cTrav = CollisionTraverser()  13  14 # Initialize the handler.  15 self.collHandEvent = CollisionHandlerEvent()  16 self.collHandEvent.addInPattern('into-%in')  17 self.collHandEvent.addOutPattern('outof-%in')  18  19 # Make a variable to store the unique collision string count.  20 self.collCount = 0  21  22 # Load a model. Reparent it to the camera so we can move it.  23 s = base.loader.loadModel('smiley')  24 s.reparentTo(base.camera)  25 s.setPos(0, 25, 0)  26  27 # Setup a collision solid for this model.  28 sColl = self.initCollisionSphere(s, True)  29  30 # Add this object to the traverser.  31 base.cTrav.addCollider(sColl[0], self.collHandEvent)  32  33 # Accept the events sent by the collisions.  34 self.accept('into-' + sColl[1], self.collide3)  35 self.accept('outof-' + sColl[1], self.collide4)  36 print(sColl[1])  37  38 # Load another model.  39 t = base.loader.loadModel('smiley')  40 t.reparentTo(base.render)  41 t.setPos(5, 25, 0)  42  43 # Setup a collision solid for this model.  44 tColl = self.initCollisionSphere(t, True)  45  46 # Add this object to the traverser.  47 base.cTrav.addCollider(tColl[0], self.collHandEvent)  48  49 # Accept the events sent by the collisions.  50 self.accept('into-' + tColl[1], self.collide)  51 self.accept('outof-' + tColl[1], self.collide2)  52 print(tColl[1])  53  54 print("WERT")  55  56 def collide(self, collEntry):  57 print("WERT: object has collided into another object")  58 collParent = collEntry.getFromNodePath().getParent()  59 Sequence(  60 Func(collParent.setColor, (1, 0, 0, 1)),  61 Wait(0.2),  62 Func(collParent.setColor, (0, 1, 0, 1)),  63 Wait(0.2),  64 Func(collParent.setColor, (1, 1, 1, 1)),  65 ).start()  66  67 def collide2(self, collEntry):  68 print("WERT.: object is no longer colliding with another object")  69  70 def collide3(self, collEntry):  71 print("WERT2: object has collided into another object")  72  73 def collide4(self, collEntry):  74 print("WERT2: object is no longer colliding with another object")  75  76 def initCollisionSphere(self, obj, show=False):  77 # Get the size of the object for the collision sphere.  78 bounds = obj.getChild(0).getBounds()  79 center = bounds.getCenter()  80 radius = bounds.getRadius() * 1.1  81  82 # Create a collision sphere and name it something understandable.  83 collSphereStr = 'CollisionHull{0}_{1}'.format(self.collCount, obj.name)  84 self.collCount += 1  85 cNode = CollisionNode(collSphereStr)  86 cNode.addSolid(CollisionSphere(center, radius))  87  88 cNodepath = obj.attachNewNode(cNode)  89 if show:  90 cNodepath.show()  91  92 # Return a tuple with the collision node and its corresponding string so  93 # that the bitmask can be set.  94 return (cNodepath, collSphereStr)  95  96  97base = ShowBase()  98# Run the world. Move around with the mouse to create collisions.  99w = World() 100base.run()