Hi people, I´m still trying to use classes in my Panda3D game, but it looks I haven´t been 100% sucefull since my camera is acting weird.
When The camera rotates(using Q and E keys), it is nice and smooth, but when the charater walks(up,down,left or right) the camera starts trembling until the player stops moving.
Also, when left/right keys are pressed, the charater appears to be moving around the camera, which is not right. When I deactivate my camera(thus using Panda3D default one) the left/right issue don´t happen anymore.
I need some serious help here, since I have been stuck days in these problems. If you need more details to help me, say. Code Below:
OBS: The movimentation is kingdom hearths based.
import direct.directbase.DirectStart
from pandac.PandaModules import PandaNode, LightNode, TextNode, NodePath, Camera
from pandac.PandaModules import Filename
from pandac.PandaModules import PointLight, AmbientLight
from pandac.PandaModules import LightRampAttrib, AuxBitplaneAttrib
from pandac.PandaModules import CardMaker
from pandac.PandaModules import Shader, Texture
from pandac.PandaModules import Point3,Vec2,Vec3,Vec4,BitMask32
from pandac.PandaModules import *
from direct.task import Task
from direct.actor import Actor
from direct.interval.IntervalGlobal import *
from direct.showbase.DirectObject import DirectObject
from direct.filter.CommonFilters import CommonFilters
from direct.gui.OnscreenText import OnscreenText
import random, sys, os, math
base.accept("escape", sys.exit)
base.setFrameRateMeter(True)
render.setAntialias(AntialiasAttrib.MAuto)
# Discovers in which directory this program is
MYDIR=os.path.abspath(sys.path[0])
MYDIR=Filename.fromOsSpecific(MYDIR).getFullpath()
#Player
class Avatar(DirectObject):
def __init__(self):
self.states = {"right":0, "left":0, "forward":0, "backward":0}
self.isMoving = False
self.loadActor()
self.eventCapture()
taskMgr.add(self.move, "move avatar")
taskMgr.add(self.anim, "anim avatar")
def loadActor(self):
self.player = render.attachNewNode("player")
self.playerActor = Actor.Actor("models/player")
self.playerActor.setScale(0.1,0.1,0.1)
self.playerActor.reparentTo(self.player)
self.playerActor.loop("still")
def eventCapture(self):
self.accept( "d", self.changeState, ["right",1] )
self.accept( "a", self.changeState, ["left",1] )
self.accept( "w", self.changeState, ["forward",1] )
self.accept( "s", self.changeState, ["backward",1] )
self.accept( "d-up", self.changeState, ["right",0] )
self.accept( "a-up", self.changeState, ["left",0] )
self.accept( "w-up", self.changeState, ["forward",0] )
self.accept( "s-up", self.changeState, ["backward",0] )
def changeState(self, key, value):
self.states[key] = value
def move(self, task):
elapsed = globalClock.getDt()
if (self.states["right"] != 0):
self.playerActor.setH(90)
self.player.setH(base.camera.getH())
self.player.setX(self.player, +(elapsed*5))
if (self.states["left"] != 0):
self.playerActor.setH(-90)
self.player.setH(base.camera.getH())
self.player.setX(self.player, -(elapsed*5))
if (self.states["forward"] != 0):
self.playerActor.setH(180)
self.player.setH(base.camera.getH())
self.player.setY(self.player, +(elapsed*5))
if (self.states["backward"] !=0):
self.playerActor.setH(0)
self.player.setH(base.camera.getH())
self.player.setY(self.player, -(elapsed*5))
return Task.cont
def anim(self,task):
if (self.states["forward"]!=0) or (self.states["left"]!=0) or (self.states["right"]!=0) or (self.states["backward"]!=0):
if self.isMoving is False:
self.playerActor.loop("run")
self.isMoving = True
else:
if self.isMoving:
self.playerActor.loop("still")
self.isMoving = False
return Task.cont
#Level
class Level():
def __init__(self,player):
self.player=player
self.loadScenario()
def loadScenario(self):
self.Level = loader.loadModel("models/peaks")
self.Level.reparentTo(render)
self.Level.setScale(10,10,10)
self.Level.setPos(0,0,-9)
playerStartPos = self.Level.find("**/start_point").getPos()
self.player.setPos(playerStartPos-0.5)
#Camera
class Camera(DirectObject):
def __init__(self,player):
self.player=player
self.eventCapture()
self.states = {"cam_left":0, "cam_right":0}
base.win.setClearColor(Vec4(0,0,0,1))
self.floater = NodePath(PandaNode("floater"))
self.floater.reparentTo(render)
self.isMoving = False
base.disableMouse()
base.camera.setPos(self.player.getX(),self.player.getY()+10,2.5)
taskMgr.add(self.camtrack, "Cam track")
def eventCapture(self):
self.accept( "q", self.changeState, ["cam_left",1] )
self.accept( "e", self.changeState, ["cam_right",1] )
self.accept( "q-up", self.changeState, ["cam_left",0] )
self.accept( "e-up", self.changeState, ["cam_right",0] )
def changeState(self, key, value):
self.states[key] = value
def camtrack(self,task):
self.elapsed = globalClock.getDt()
base.camera.lookAt(self.player)
if (self.states["cam_left"] != 0):
base.camera.setX(base.camera, +(self.elapsed*20))
if (self.states["cam_right"] !=0):
base.camera.setX(base.camera, -(self.elapsed*20))
camvec = self.player.getPos() - base.camera.getPos()
camvec.setZ(0)
camdist = camvec.length()
camvec.normalize()
if (camdist > 9.0):
base.camera.setPos(base.camera.getPos() + camvec*(camdist-9))
camdist = 9.0
if (camdist < 9.0):
base.camera.setPos(base.camera.getPos() - camvec*(9-camdist))
camdist = 9.0
self.floater.setPos(self.player.getPos())
self.floater.setZ(self.player.getZ() + 0.5)
base.camera.lookAt(self.floater)
return Task.cont
Avatarobject = Avatar()
Levelobject = Level(Avatarobject.player)
Cameraobject = Camera(Avatarobject.player)
run()