gpt4 book ai didi

java - LWJGL 3 GLFW 键盘和鼠标输入速度慢,并且在 GLFW_PRESS 和 GLFW_REPEAT 之间有延迟

转载 作者:行者123 更新时间:2023-11-29 09:52:30 28 4
gpt4 key购买 nike

所以我最近刚从 LWJGL 2 转移到 3,我在获取键盘和鼠标输入方面遇到了一些困难。顺便说一句,我将其用于相机移动和旋转。

我的问题是,如果我使用 GLFW 回调,移动看起来非常不稳定和缓慢。这不是一个一致的速度,只是感觉不对。此外,当我按下一个键时,例如 w 向前移动,从 GLFW_PRESSGLFW_REPEAT 之间有大约半秒的延迟,这会导致相机不按下键时移动前半秒。

顺便说一句,我有一个 InputHandler 类,它具有 keyDown、keyPressed、keyReleased 等方法。我没有在一个调用方法中进行所有的键检查。调用方法将键事件添加到列表中,该列表存储 key 和一个事件状态枚举,它可以是 DOWN、TAPPED、RELEASED、NONE 之一。该类(class)主要基于对 this question 的响应

在过去的 2 个小时里,我一直在努力寻找解决方案,但没有找到太多。不过,我确实发现有些人使用回调的替代方法,例如:

if (glfwGetKey(window, key) == GLFW_PRESS)

if (glfwGetKey(windowm key) == GLFW_RELEASE)

但我无法找到一种方法来使用它来检测单个按键点击,即 GLFW_REPEAT 状态,因为 glfwGetKey 方法只能检测 GLFW_PRESSGLFW_RELEASE

如果有人能告诉我一种使用 glfwGetKey 方法检测单键敲击的方法,或者让 GLFW 回调更流畅、更流畅,我将不胜感激。

谢谢:)

最佳答案

所以我解决了这个问题,这要归功于 Brett Hale 的建议,即在触发 GLFW_RELEASE 事件之前假设按键已按下。这是我的工作实现:

public final class InputHandler
{
private static long window;
private static final int KEYBOARD_SIZE = 512;
private static final int MOUSE_SIZE = 16;

private static int[] keyStates = new int[KEYBOARD_SIZE];
private static boolean[] activeKeys = new boolean[KEYBOARD_SIZE];

private static int[] mouseButtonStates = new int[MOUSE_SIZE];
private static boolean[] activeMouseButtons = new boolean[MOUSE_SIZE];
private static long lastMouseNS = 0;
private static long mouseDoubleClickPeriodNS = 1000000000 / 5; //5th of a second for double click.

private static int NO_STATE = -1;


protected static GLFWKeyCallback keyboard = new GLFWKeyCallback()
{
@Override
public void invoke(long window, int key, int scancode, int action, int mods)
{
activeKeys[key] = action != GLFW_RELEASE;
keyStates[key] = action;
}
};

protected static GLFWMouseButtonCallback mouse = new GLFWMouseButtonCallback()
{
@Override
public void invoke(long window, int button, int action, int mods)
{
activeMouseButtons[button] = action != GLFW_RELEASE;
mouseButtonStates[button] = action;
}
};

protected static void init(long window)
{
InputHandler.window = window;

resetKeyboard();
resetMouse();
}

protected static void update()
{
resetKeyboard();
resetMouse();

glfwPollEvents();
Engine.getInput();
}

private static void resetKeyboard()
{
for (int i = 0; i < keyStates.length; i++)
{
keyStates[i] = NO_STATE;
}
}

private static void resetMouse()
{
for (int i = 0; i < mouseButtonStates.length; i++)
{
mouseButtonStates[i] = NO_STATE;
}

long now = System.nanoTime();

if (now - lastMouseNS > mouseDoubleClickPeriodNS)
lastMouseNS = 0;
}

public static boolean keyDown(int key)
{
return activeKeys[key];
}

public static boolean keyPressed(int key)
{
return keyStates[key] == GLFW_PRESS;
}

public static boolean keyReleased(int key)
{
return keyStates[key] == GLFW_RELEASE;
}

public static boolean mouseButtonDown(int button)
{
return activeMouseButtons[button];
}

public static boolean mouseButtonPressed(int button)
{
return mouseButtonStates[button] == GLFW_RELEASE;
}

public static boolean mouseButtonReleased(int button)
{
boolean flag = mouseButtonStates[button] == GLFW_RELEASE;

if (flag)
lastMouseNS = System.nanoTime();

return flag;
}

public static boolean mouseButtonDoubleClicked(int button)
{
long last = lastMouseNS;
boolean flag = mouseButtonReleased(button);

long now = System.nanoTime();

if (flag && now - last < mouseDoubleClickPeriodNS)
{
lastMouseNS = 0;
return true;
}

return false;
}
}

如果您愿意,请随意使用此代码。只是一些注意事项:应该在每一帧调用更新方法。此外,如果您在其他地方有 glfwPollEvents(),我认为这很可能,那么您需要保持重置键盘/鼠标的顺序,然后轮询,然后 getinput()。

编辑:我的 Engine.getInput() 方法就是告诉场景图中需要输入的节点(即玩家)查询该输入。

关于java - LWJGL 3 GLFW 键盘和鼠标输入速度慢,并且在 GLFW_PRESS 和 GLFW_REPEAT 之间有延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36550851/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com