mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-29 06:32:40 -06:00
112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
|
"""
|
||
|
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 messeges that allow a listener to play sounds or
|
||
|
animations based on walker events.
|
||
|
"""
|
||
|
|
||
|
from direct.showbase.ShowBaseGlobal import *
|
||
|
from pandac.PandaModules import *
|
||
|
from direct.directnotify import DirectNotifyGlobal
|
||
|
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
|