Garbage Collector

Hi, :smiley:

Lets say that I have this code:

class NPC(FSM):
    def __init__(self):
        FSM.__init__(self, 'NPC FSM')

        self.nodePath = NodePath('NPC NodePath')
        self.nodePath.reparentTo(render)

        self.nodePath.setTag('pickable', 'NPC')

        self.Actor = Actor('ralph',
                           {'run':'ralph-run'})
        self.Actor.reparentTo(self.nodePath)

        self.Hat = loader.loadModel('hat')
        self.Hat.reparentTo(self.Actor)

        self.setupCollisions()

        taskMgr.add(self.updateTask, 'updateTask')

        self.request('move')

    def setupCollisions(self):

        # Create a Sphere to be clickable
        ActorSphere = CollisionSphere(0,0,1,1)
        
        self.enemyCol = CollisionNode(' Enemy CollisionSphere')
        self.enemyCol.addSolid(ActorSphere)
        self.enemyCol.setFromCollideMask(BitMask32.bit(2)|BitMask32.bit(3))
        self.enemyCol.setIntoCollideMask(BitMask32.bit(10)) 
        
        self.enemyColNP = self.nodePath.attachNewNode(self.enemyCol)
        self.enemyHandler = CollisionHandlerPusher()
        self.enemyHandler.addCollider(self.enemyColNP, self.nodePath)
        base.cTrav.addCollider(self.enemyColNP, self.enemyHandler)
        
        # Create the collision Ray to collide with the floor
        ActorRay = CollisionRay(0,0,1,0,0,-1)
        
        self.enemyGroundCol = CollisionNode('Enemy CollisionRay')
        self.enemyGroundCol.addSolid(ActorRay)
        self.enemyGroundCol.setFromCollideMask(BitMask32.bit(1))
        self.enemyGroundCol.setIntoCollideMask(BitMask32.allOff())
        
        self.enemyGroundColNP = self.nodePath.attachNewNode(self.enemyGroundCol)
        self.enemyGroundHandler = CollisionHandlerFloor()
        self.enemyGroundHandler.addCollider(self.enemyGroundColNP, self.nodePath) 
        base.cTrav.addCollider(self.enemyGroundColNP, self.enemyGroundHandler)


    def setAi(self, world):

        self.AIworld = AIworld
        self.AIchar = AICharacter('NPC - AI', self.nodePath, 100, 1.05, 10)
        
        self.AIworld.addAiChar(self.AIchar)
        self.AIbehaviors = self.AIchar.getAiBehaviors()

    def updateTask(self, task):
        return task.cont

    def enterMove(self):

        self.Actor.loop('run')

    def exitMove(self):

        pass

    def destroy(self):

        self.AIworld.removeAiChar('NPC - AI')

        self.nodePath.removeNode()

        taskMgr.remove('updateTask')

        base.cTrav.removeCollider(self.enemyGroundColNP)
        base.cTrav.removeCollider(self.enemyColNP)

    def __del__(self):

        print 'deleted'
        

I wanna make sure that everything is deleted.
It prints deleted whether or not I call base.cTrav.removeCollider
Do I need to call base.cTrav.removeCollider??
I’ve been reading and did not found ppl calling this.

If you plan to use cTrav again for something else, then you need to call cTrav.removeCollider(), or they’ll continue to be in the list of colliders handled by cTrav.

But if you are not going to use cTrav any more–for instance, because you’re shutting down, or because you’re about to replace base.cTrav with a new CollisionTraverser object–then you don’t need to call removeCollider(), because in that case who cares? All of the objects will still be deleted properly.

David