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()