Hello,
I try the fuction for acceleration a actor, but it don’t work. Could someone tell me, what I do wrong? Because I dont get it.
import direct.directbase.DirectStart
from pandac.PandaModules import CollisionTraverser,CollisionNode
from pandac.PandaModules import CollisionHandlerQueue,CollisionRay
from pandac.PandaModules import Filename
from pandac.PandaModules import PandaNode,NodePath,Camera,TextNode
from pandac.PandaModules import Vec3,Vec4,BitMask32
from direct.gui.OnscreenText import OnscreenText
from direct.actor.Actor import Actor
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
import random, sys, os, math
MYDIR=os.path.abspath(sys.path[0])
MYDIR=Filename.fromOsSpecific(MYDIR).getFullpath()
class World(DirectObject):
def __init__(self):
self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0}
base.win.setClearColor(Vec4(0,0,0,1))
self.environ = loader.loadModel("models/world")
self.environ.reparentTo(render)
self.environ.setPos(0,0,0)
auto1StartPos = self.environ.find("**/start_point").getPos()
self.auto1 = Actor("models/carnsx")
self.auto1.reparentTo(render)
self.auto1.setScale(.5)
self.auto1.setPos(auto1StartPos)
self.auto1.speed = 0 # current speed
self.auto1.maxSpeed = 60.0 # maximum speed
self.auto1.acceleration = 0.3 # acceleration rate
self.floater = NodePath(PandaNode("floater"))
self.floater.reparentTo(render)
self.accept("escape", sys.exit)
self.accept("arrow_left", self.setKey, ["left",1])
self.accept("arrow_right", self.setKey, ["right",1])
self.accept("arrow_up", self.setKey, ["forward",1])
self.accept("arrow_left-up", self.setKey, ["left",0])
self.accept("arrow_right-up", self.setKey, ["right",0])
self.accept("arrow_up-up", self.setKey, ["forward",0])
taskMgr.add(self.move,"moveTask")
self.prevtime = 0
self.isMoving = False
base.disableMouse()
base.camera.setPos(self.auto1.getX(),self.auto1.getY()+50,15)
self.cTrav = CollisionTraverser()
self.auto1GroundRay = CollisionRay()
self.auto1GroundRay.setOrigin(0,0,1000)
self.auto1GroundRay.setDirection(0,0,-1)
self.auto1GroundCol = CollisionNode('auto1Ray')
self.auto1GroundCol.addSolid(self.auto1GroundRay)
self.auto1GroundCol.setFromCollideMask(BitMask32.bit(0))
self.auto1GroundCol.setIntoCollideMask(BitMask32.allOff())
self.auto1GroundColNp = self.auto1.attachNewNode(self.auto1GroundCol)
self.auto1GroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.auto1GroundColNp, self.auto1GroundHandler)
self.camGroundRay = CollisionRay()
self.camGroundRay.setOrigin(0,0,1000)
self.camGroundRay.setDirection(0,0,-1)
self.camGroundCol = CollisionNode('camRay')
self.camGroundCol.addSolid(self.camGroundRay)
self.camGroundCol.setFromCollideMask(BitMask32.bit(0))
self.camGroundCol.setIntoCollideMask(BitMask32.allOff())
self.camGroundColNp = base.camera.attachNewNode(self.camGroundCol)
self.camGroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)
def setKey(self, key, value):
self.keyMap[key] = value
def move(self, task):
elapsed = task.time - self.prevtime
base.camera.lookAt(self.auto1)
camright = base.camera.getNetTransform().getMat().getRow3(0)
camright.normalize()
startpos = self.auto1.getPos()
if (self.keyMap["left"]!=0):
self.auto1.setH(self.auto1.getH() + elapsed*300)
if (self.keyMap["right"]!=0):
self.auto1.setH(self.auto1.getH() - elapsed*300)
if (self.keyMap["forward"]!=0):
if self.auto1.speed < self.auto1.maxSpeed:
if self.auto1.speed + self.auto1.acceleration > self.auto1.maxSpeed:
self.auto1.speed = self.auto1.maxSpeed
else:
# add to the speed, each frame
self.auto1.speed += self.auto1.acceleration
# move a certain distance with current speed
dist = self.auto1.speed/10
angle = self.auto1.getH()*math.pi/180.0
dx = dist*math.sin(angle)
dy = dist*-math.cos(angle)
self.auto1.setPos(self.getX()+dx,self.getY()+dy,self.getZ())
camvec = self.auto1.getPos() - base.camera.getPos()
camvec.setZ(0)
camdist = camvec.length()
camvec.normalize()
if (camdist > 10.0):
base.camera.setPos(base.camera.getPos() + camvec*(camdist-20))
camdist = 20.0
if (camdist < 5.0):
base.camera.setPos(base.camera.getPos() - camvec*(5-camdist))
camdist = 5.0
self.cTrav.traverse(render)
entries = []
for i in range(self.auto1GroundHandler.getNumEntries()):
entry = self.auto1GroundHandler.getEntry(i)
entries.append(entry)
entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
x.getSurfacePoint(render).getZ()))
if (len(entries)>0) and (entries[0].getIntoNode().getName() == "terrain"):
self.auto1.setZ(entries[0].getSurfacePoint(render).getZ())
else:
self.auto1.setPos(startpos)
self.prevtime = task.time
return Task.cont
w = World()
run()