Collisions problem

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

Wrong identation ? You need to define traverseTask in one “Left”-Level.

After that change:

taskMgr.add(traverseTask, "tsk_traverse")

to:

taskMgr.add(self.traverseTask, "tsk_traverse")

p.s Don`t forget to “traverse”, because base.cTrav is doing this automatically