NoUserOrg

Reto Spoerri : Game Design : Zürich

ProgrammingPanda3dTutorialBeispiele

Filed in: Resources.ProgrammingPanda3dTutorialBeispiele · Modified on : Fri, 31 Jul 09

<code type="Python">

  1. BEISPIEL1
  2. laedt eine szene und einen charakter
  3. keine kollisionen

from direct.directbase import DirectStart from pandac.PandaModules import * from direct.showbase.DirectObject import DirectObject

import string

  1. liste von events die wir abfangen

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' ] ) 
  1. diese klasse speichert welche tasten momentan gedrueckt werden

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

  1. defintion der tasten und der ausgefuehrten bewegung

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>