【问题标题】:How to make panda3d accept controls faster?如何让 panda3d 更快地接受控件?
【发布时间】:2015-08-12 16:34:54
【问题描述】:

您好,我正在尝试在 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的默认相机。

任何帮助将不胜感激!

【问题讨论】:

    标签: python python-2.7 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 以保持游戏在不同帧速率下看起来相同的速度。

    【讨论】:

    • 是的,Panda3D 正在积极开发中。如果您需要说服力,请查看 GitHub 上的提交历史。 :)
    • 那你可以试试taskMgr.add(lambda t: self.set_cam(t), "setcamTask"),但我不确定这是否太hacky或者它实际上有助于代码组织。
    • 请注意,您可以通过执行 base.mouseWatcherNode.isButtonDown("arrow_left") 或类似的操作来使用轮询,而不是保留自己的键映射。另外,请删除关于 Panda3D 不再开发的错误说法;最新版本是两个月前才发布的,GitHub 上明显显示频繁提交。
    猜你喜欢
    • 2010-10-25
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多