I’m trying to learn to use Collisions in Panda as per this tutorial: [url]Panda3d Collisions made simple]. I also studied Roaming Ralph and Tiny’s room tutorial. I applied astelix’s code from the beginners tutorial package, 1st example, but inside ShowBase. It doesn’t seem to work.
I think I loaded the required modules:
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from pandac.PandaModules import CollisionHandlerQueue, CollisionNode, CollisionSphere, CollisionTraverser
from direct.showbase.ShowBase import ShowBase
from direct.filter.CommonFilters import *
import sys,os
import time
I basically want to reparent a sphere to the camera and place it in front of the camera. Then place another sphere in a 3D space. As I move the camera and the 2 spheres collide I want to apply a different texture (basically anything to present that the collision took place).
I’m getting errors. It says libpanda.PythonTask object has no attribute collisionHandler.
EDIT: After removing the ‘self’ component, the code works. I don’t understand why I can’t code it the way I did previously. Anyone can shed some light please?
What did I do wrong? Here is the original code with errors:
class GameDemo(ShowBase):
def __init__(self):
ShowBase.__init__(self)
#some code skipped
self.cTrav=CollisionTraverser()
self.collisionHandler = CollisionHandlerQueue()
self.smileyModel = loader.loadModel('models/sphere01')
self.smileyCollider = self.smileyModel.attachNewNode(CollisionNode('smileycnode'))
self.smileyCollider.node().addSolid(CollisionSphere(0, 0, 0, 1))
self.smileyModel.reparentTo(render)
self.smileyModel.reparentTo(base.cam)
self.smileyModel.setPos(0, 30, 0)
self.cTrav.addCollider(self.smileyCollider, self.collisionHandler)
self.frowneyModel = loader.loadModel('models/sphere01')
self.brick_tex1 = loader.loadTexture("models/beam02.jpg")
self.brick_tex2 = loader.loadTexture("models/windowscreens02.jpg")
self.frowneyModel.reparentTo(render)
self.frowneyModel.setPos(450, -500, 20)
self.frowneyCollider = self.frowneyModel.attachNewNode(CollisionNode('frowneycnode'))
self.frowneyCollider.node().addSolid(CollisionSphere(0, 0, 0, 1))
def traverseTask(self, task=None):
self.collisionHandler.sortEntries()
for i in range(self.collisionHandler.getNumEntries()):
entry = self.collisionHandler.getEntry(i)
self.frowneyModel.setTexture(self.brick_tex1, 1)
if task: return task.cont
self.frowneyModel.setTexture(self.brick_tex2, 1)
if task: return task.cont
taskMgr.add(traverseTask, "tsk_traverse")
#some code skipped
t = GameDemo()
run()
And here is the new code that works:
base.cTrav=CollisionTraverser()
collisionHandler = CollisionHandlerQueue()
self.smileyModel = loader.loadModel('models/sphere01')
self.smileyCollider = self.smileyModel.attachNewNode(CollisionNode('smileycnode'))
self.smileyCollider.node().addSolid(CollisionSphere(0, 0, 0, 1))
self.smileyModel.reparentTo(render)
self.smileyModel.reparentTo(base.cam)
self.smileyModel.setPos(0, 30, 0)
base.cTrav.addCollider(self.smileyCollider, collisionHandler)
self.frowneyModel = loader.loadModel('models/sphere01')
self.brick_tex1 = loader.loadTexture("models/beam02.jpg")
self.brick_tex2 = loader.loadTexture("models/windowscreens02.jpg")
self.frowneyModel.reparentTo(render)
self.frowneyModel.setPos(450, -500, 20)
self.frowneyCollider = self.frowneyModel.attachNewNode(CollisionNode('frowneycnode'))
self.frowneyCollider.node().addSolid(CollisionSphere(0, 0, 0, 1))
def traverseTask(task=None):
collisionHandler.sortEntries()
for i in range(collisionHandler.getNumEntries()):
entry = collisionHandler.getEntry(i)
self.frowneyModel.setTexture(self.brick_tex1, 1)
if task: return task.cont
self.frowneyModel.setTexture(self.brick_tex2, 1)
if task: return task.cont
taskMgr.add(traverseTask, "tsk_traverse")