Filed in: Resources.ProgrammingPanda3dTutorialBeispiele · Modified on : Fri, 31 Jul 09
<code type="Python">
from direct.directbase import DirectStart from pandac.PandaModules import * from direct.showbase.DirectObject import DirectObject
import string
POLLKEYS = list(string.ascii_lowercase+string.digits) POLLKEYS.extend(
[ '_del', 'alt', 'asciiKey', 'backspace', 'capsLock', 'control', 'down', 'end', 'enter', 'escape', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'help', 'home', 'insert', 'lalt', 'lcontrol', 'left', 'lshift', 'meta', 'numLock', 'pageDown', 'pageUp', 'pause', 'printScreen', 'ralt', 'rcontrol', 'right', 'rshift', 'scrollLock', 'shift', 'shiftLock', 'space', 'tab', 'this', 'this_metatype', 'up', 'arrow_up', 'arrow_down', 'arrow_left', 'arrow_right' ] )
class KeyPollerClass( DirectObject ):
def __init__( self ):
self.data = dict()
for key in POLLKEYS:
self.accept( key, self.event, [key, True] )
self.accept( key+"-up", self.event, [key, False] )
self.data[ key ] = False
def event( self, key, active ):
self.data[key] = active
def __getitem__( self, key ):
return self.data[key]
keyPoller = KeyPollerClass()
MOVEFUNCTIONS = { 'arrow_up' : Vec3(0,-20,0),
'arrow_down' : Vec3(0, 20,0) }
ROTATEFUNCTIONS = { 'arrow_left' : Vec3( 90,0,0),
'arrow_right': Vec3(-90,0,0) }
class World:
def __init__( self ):
# lade den character
self.character = loader.loadModel( 'panda' )
self.character.reparentTo( render )
# lade eine umgebung
self.environment = loader.loadModel( 'environment' )
self.environment.reparentTo( render )
# positioniere die kamera
base.disableMouse()
base.camera.reparentTo( self.character )
base.camera.setPos( 0,40,20 )
base.camera.lookAt( 0,0,10 )
# starte den task fuer die bewegung/rotation
taskMgr.add( self.moveTask, 'moveTask' )
def moveTask( self, task ):
# vergangene zeit seit dem letzten frame
dt = globalClock.getDt()
# fuer jede gedrueckte taste aus den MOVEFUNCTIONS
for key, action in MOVEFUNCTIONS.items():
if keyPoller[ key ]:
# bewege den panda relativ zu sich selbst um den Vektor*Zeit
self.character.setPos( self.character, action*dt )
for key, action in ROTATEFUNCTIONS.items():
if keyPoller[ key ]:
# rotiere den panda relativ zu sich selbst um den Vektor*Zeit
self.character.setHpr( self.character, action*dt )
# wiederhole diesen task
return task.cont
if __name__ == _main_:
# dieser teil wird nur ausgefuehrt wenn dieses file _nicht_ importiert wird world = World() run()
</code>