【发布时间】:2016-04-11 13:57:33
【问题描述】:
所以我最近刚从 LWJGL 2 转到 3,我在获得键盘和鼠标输入时遇到了一些困难。顺便说一句,我正在使用它来移动和旋转相机。
我的问题是,如果我使用 GLFW 回调,移动似乎非常不稳定和缓慢。这不是一个一致的速度,只是感觉不对。此外,当我按下一个键时,例如 w 向前移动,从 GLFW_PRESS 到 GLFW_REPEAT 的转换之间大约有半秒的延迟被按下。
顺便说一句,我有一个 InputHandler 类,它具有 keyDown、keyPressed、keyReleased 等方法。我没有在一个调用方法中进行所有键检查。调用方法将键事件添加到列表中存储密钥和一个事件状态枚举,可以是 DOWN、TAPPED、RELEASED、NONE 之一。该课程主要基于对this question的回复
在过去的 2 个小时里,我一直在尝试解决这个问题,但没有找到太多的解决方案。我确实发现有些人使用回调的替代方法,就像这样:
if (glfwGetKey(window, key) == GLFW_PRESS)
和
if (glfwGetKey(windowm key) == GLFW_RELEASE)
但我无法找到一种方法来使用它来检测单个按键点击,即GLFW_REPEAT 状态,因为glfwGetKey 方法只能检测GLFW_PRESS 和GLFW_RELEASE。
如果有人能告诉我一种使用 glfwGetKey 方法检测单个按键敲击的方法,或者使 GLFW 回调更不滞后,更流畅,我将不胜感激。
谢谢:)
【问题讨论】:
-
大概,如果您正在制作动画(在循环中使用
glfwPollEvents),您可以假设键被按住,直到您的键处理程序回调接收到该键的RELEASE。否则,循环中的glfwWaitEvents不会做任何事情,直到窗口系统决定REPEAT的时间间隔足够长。 -
有没有办法缩短注册
GLFW_REPEAT的时间? -
不使用 glfw。可能有依赖于操作系统的方法来做到这一点,但 glfw 只响应操作系统提供的事件。而且我怀疑它会产生全局影响,而不是针对每个应用程序。
-
好的。好吧,我设法得到您的建议,即假设密钥已关闭,直到触发
GLFW_RELEASE事件。它有效,我将发布我的工作 InputHandler 类,谢谢 :)
标签: java opengl user-input lwjgl glfw