如何让panda3d更快地接受控制?

2024-04-20 10:56:30 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试在panda3d v1.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的默认相机

任何帮助都将不胜感激!你知道吗


Tags: selfifdefpanda3dglobalrepeatacceptarrow
1条回答
网友
1楼 · 发布于 2024-04-20 10:56:30

您应该避免使用“-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乘以移动量,以保持游戏在不同帧速率下保持相同的速度。你知道吗

相关问题 更多 >