Как заставить panda3d принимать управление быстрее?
Привет, я пытаюсь сделать игру на panda3d v 1.8.1 (python), но управление кажется очень неаккуратным. Нужно держать клавиши нажатыми в течение секунды или двух, чтобы все произошло. Есть ли способ заставить panda3d принимать управление быстрее?
Вот мой код моего ключевого обработчика:
class KeyHandler(DirectObject):
def __init__(self):
self.accept('arrow_left-repeat', self.lookLeft)
self.accept('arrow_right-repeat', self.lookRight)
self.accept('arrow_up-repeat', self.lookUp)
self.accept('arrow_down-repeat', self.lookDown)
self.accept('w-repeat', self.Moveforward)
self.accept('s-repeat', self.Movebackward)
self.accept('a-repeat', self.Moveleft)
self.accept('d-repeat', self.Moveright)
self.accept('q-repeat', self.MoveDown)
self.accept('e-repeat', self.MoveUp)
self.accept('space', self.Dotask)
def lookLeft(self):
global camxy
camxy += 2
def lookRight(self):
global camxy
camxy -= 2
def lookUp(self):
global camyz
camyz += 2
def lookDown(self):
global camyz
camyz -= 2
def Moveforward(self):
global camx
if camx < 57 :
camx += 1
def Movebackward(self):
global camx
if camx > -32 :
camx -= 1
def Moveleft(self):
global camy
if camy < 42 :
camy += 1
def Moveright(self):
global camy
if camy > -36 :
camy -= 1
def MoveUp(self):
global camz
if camz < 15 :
camz += 0.5
def MoveDown(self):
global camz
if camz >1 :
camz -= 0.5
a = KeyHandler()
def set_cam(task) :
camera.setPos(camx,camy,camz)
camera.setHpr(camxy,camyz,camzx)
taskMgr.add(set_cam, "setcamTask")
Камера, которую я использую, является камерой по умолчанию для panda3d.
Любая помощь будет оценена!
1 ответ
Вам следует избегать использования обработчиков "-repeat". Они запускаются так же долго, как и другие буквы, если вы удерживаете клавишу в любом текстовом поле.
Обычный способ заключается в использовании dict
сохранение состояния ключа:
class KeyHandler(DirectObject):
keys = {"lookLeft": False, "lookRight": False} # etcetera
def __init__(self):
DirectObject.__init__(self)
self.accept('arrow_left', self.pressKey, ["lookLeft"])
self.accept('arrow_left-up', self.releaseKey, ["lookRight"])
taskMgr.add(self.set_cam, "setcamTask")
def pressKey(self, key):
self.keys[key] = True
def releaseKey(self, key):
self.keys[key] = False
# Hopefully method will be passed bound
def set_cam(self, task):
dt = globalClock.getDt()
if self.keys["lookLeft"]:
camera.setH(camera.getH() + 2 * dt)
elif self.keys["lookRight"]:
camera.setH(camera.getH() + 2 * dt)
a = KeyHandler()
Это также позволит вам более легко определять пользовательские настройки для клавиш.
Это не первая или даже самая важная проблема с этим кодом, хотя. set_cam
действительно должен быть методом KeyHandler
вместо того, чтобы объявлять каждую переменную глобальной, вам нужно умножить движение на dt каждого кадра, чтобы игра выглядела одинаково с разными частотами кадров.