GLFW 与 LWJGL - glfwGetKey once
GLFW with LWJGL - glfwGetKey once
我正在使用 java 和 LWJGL3 开发游戏。但我不明白如何解决我的问题,我尝试在互联网上搜索,但有关 LWJGL 的信息很少,而且我找不到有关 GLFW 的任何信息。
举例来说,我有一个带有 4 个按钮(新游戏、选项、积分、退出)的菜单和一个计数变量,用于了解哪个是 selected。每次按下向上箭头键我想从 select 中减去一个到 select 前一个,向下箭头键也是如此,但我想添加一个。
问题如下:如果在第 0 帧我按下箭头键,则添加了计数变量,但在下一帧中仍按下该键,因此再次添加。我不知道如何解决这个问题,我尝试将 GLFW_PRESS 更改为 GLFW_RELEASE,但我希望该操作在按下键时发生。
if ((glfwGetKey(window, GLFW_KEY_UP) == GLFW_REPEAT) && select > 0) {
button[select].toggleSelect();
select--;
button[select].toggleSelect();
}
if ((glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_REPEAT) && select < button.length) {
button[select].toggleSelect();
select++;
button[select].toggleSelect();
}
我知道这段代码会抛出数组索引越界异常
您应该注册一个按键回调:
private GLFWKeyCallback keyCallback;
// ...
keyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if (action == GLFW_PRESS) {
if (key == GLFW_KEY_UP && /*...*/) {
// ...
}
if (key == GLFW_KEY_DOWN && /*...*/) {
// ...
}
}
}
}
glfwSetKeyCallback(window, keyCallback);
每次产生按键事件都会调用invoke()
方法。 action
参数可以取三个值:
GLFW_PRESS
刚按下的时候
GLFW_REPEAT
之后,当按键还在按下的时候
GLFW_RELEASE
刚松开钥匙时
虽然 glfwGetKey()
returns 仅 GLFW_PRESS
或 GLFW_RELEASE
,但按键回调仅在第一次按下按键时使用 GLFW_PRESS
并且 GLFW_REPEAT
之后,允许您区分按下键的第一帧和后续帧。
我正在使用 java 和 LWJGL3 开发游戏。但我不明白如何解决我的问题,我尝试在互联网上搜索,但有关 LWJGL 的信息很少,而且我找不到有关 GLFW 的任何信息。
举例来说,我有一个带有 4 个按钮(新游戏、选项、积分、退出)的菜单和一个计数变量,用于了解哪个是 selected。每次按下向上箭头键我想从 select 中减去一个到 select 前一个,向下箭头键也是如此,但我想添加一个。
问题如下:如果在第 0 帧我按下箭头键,则添加了计数变量,但在下一帧中仍按下该键,因此再次添加。我不知道如何解决这个问题,我尝试将 GLFW_PRESS 更改为 GLFW_RELEASE,但我希望该操作在按下键时发生。
if ((glfwGetKey(window, GLFW_KEY_UP) == GLFW_REPEAT) && select > 0) {
button[select].toggleSelect();
select--;
button[select].toggleSelect();
}
if ((glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_REPEAT) && select < button.length) {
button[select].toggleSelect();
select++;
button[select].toggleSelect();
}
我知道这段代码会抛出数组索引越界异常
您应该注册一个按键回调:
private GLFWKeyCallback keyCallback;
// ...
keyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if (action == GLFW_PRESS) {
if (key == GLFW_KEY_UP && /*...*/) {
// ...
}
if (key == GLFW_KEY_DOWN && /*...*/) {
// ...
}
}
}
}
glfwSetKeyCallback(window, keyCallback);
每次产生按键事件都会调用invoke()
方法。 action
参数可以取三个值:
GLFW_PRESS
刚按下的时候GLFW_REPEAT
之后,当按键还在按下的时候GLFW_RELEASE
刚松开钥匙时
虽然 glfwGetKey()
returns 仅 GLFW_PRESS
或 GLFW_RELEASE
,但按键回调仅在第一次按下按键时使用 GLFW_PRESS
并且 GLFW_REPEAT
之后,允许您区分按下键的第一帧和后续帧。