| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- """
- ObserverWalker.py is for avatars.
- A walker control such as this one provides:
- - creation of the collision nodes
- - handling the keyboard and mouse input for avatar movement
- - moving the avatar
- it does not:
- - play sounds
- - play animations
- although it does send messages that allow a listener to play sounds or
- animations based on walker events.
- """
- from panda3d.core import *
- from direct.directnotify import DirectNotifyGlobal
- from . import NonPhysicsWalker
- class ObserverWalker(NonPhysicsWalker.NonPhysicsWalker):
- notify = DirectNotifyGlobal.directNotify.newCategory("ObserverWalker")
- # Ghosts slide instead of jump:
- slideName = "jump"
- def initializeCollisions(self, collisionTraverser, avatarNodePath,
- avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0):
- """
- Set up the avatar for collisions
- """
- """
- Set up the avatar for collisions
- """
- assert not avatarNodePath.isEmpty()
- self.cTrav = collisionTraverser
- self.avatarNodePath = avatarNodePath
- # Set up the collision sphere
- # This is a sphere on the ground to detect barrier collisions
- self.cSphere = CollisionSphere(0.0, 0.0, 0.0, avatarRadius)
- cSphereNode = CollisionNode('Observer.cSphereNode')
- cSphereNode.addSolid(self.cSphere)
- self.cSphereNodePath = avatarNodePath.attachNewNode(cSphereNode)
- cSphereNode.setFromCollideMask(self.cSphereBitMask)
- cSphereNode.setIntoCollideMask(BitMask32.allOff())
- # set up wall collision mechanism
- self.pusher = CollisionHandlerPusher()
- self.pusher.setInPattern("enter%in")
- self.pusher.setOutPattern("exit%in")
- self.pusher.addCollider(self.cSphereNodePath, avatarNodePath)
- # activate the collider with the traverser and pusher
- self.setCollisionsActive(1)
- class Foo:
- def hasContact(self):
- return 1
- self.lifter = Foo()
- def deleteCollisions(self):
- del self.cTrav
- del self.cSphere
- self.cSphereNodePath.removeNode()
- del self.cSphereNodePath
- del self.pusher
- def setCollisionsActive(self, active = 1):
- assert self.debugPrint("setCollisionsActive(active%s)"%(active,))
- if self.collisionsActive != active:
- self.collisionsActive = active
- if active:
- self.cTrav.addCollider(self.cSphereNodePath, self.pusher)
- else:
- self.cTrav.removeCollider(self.cSphereNodePath)
- # Now that we have disabled collisions, make one more pass
- # right now to ensure we aren't standing in a wall.
- self.oneTimeCollide()
- def oneTimeCollide(self):
- """
- Makes one quick collision pass for the avatar, for instance as
- a one-time straighten-things-up operation after collisions
- have been disabled.
- """
- tempCTrav = CollisionTraverser("oneTimeCollide")
- tempCTrav.addCollider(self.cSphereNodePath, self.pusher)
- tempCTrav.traverse(render)
- def enableAvatarControls(self):
- """
- Activate the arrow keys, etc.
- """
- assert self.debugPrint("enableAvatarControls")
- pass
- def disableAvatarControls(self):
- """
- Ignore the arrow keys, etc.
- """
- assert self.debugPrint("disableAvatarControls")
- pass
|