我在LWJGL中获取鼠标输入有问题。这是我获取输入的代码:
public class MouseButInput extends GLFWMouseButtonCallback {
public static boolean[] buttons = new boolean[65536];
public static boolean isButtonPressed(int button) {
return buttons[button];
}
public static boolean isButtonPressedRelease(int button) {
boolean isPressed = buttons[button];
if (isPressed) System.out.println("TEST 1");
buttons[button] = false;
if (isPressed) System.out.println("TEST 2");
return isPressed;
}
@Override
public void invoke(long window, int button, int action, int mods) {
if (action == GLFW_PRESS) buttons[button] = true;
else buttons[button] = false;
}
}
我原本遇到一个问题,当我点击一次时,isButtonPressed()
方法会在接下来的5-10个更新中返回true,因为按钮实际按下了多长时间。我创建了isButtonPressedRelease()
方法,如果按下按钮则返回true,然后将buttons
中的按钮值设置为false,这样下一次更新就不会返回true。问题是,它似乎永远不会回归真实。在我返回它之前,我输入了一些打印行来测试isPressed
是否为真。如果我切换回使用isButtonPressed()
方法,一切都按预期工作。
不确定我在这里缺少什么......我的猜测是它与混合静态和非静态方法/变量有关?
此外,我在这里调用方法:
public void update() {
isHover = (aabb.intersectsPoint(MousePosInput.pos.x, MousePosInput.pos.y)) ? true : false;
if (MouseButInput.isButtonPressedRelease(GLFW_MOUSE_BUTTON_1) && isHover && onclick != null) {
ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "Button clicked.");
onclick.actionPerformed(evt);
} else {
}
}
的修改
为了澄清,当我的应用程序启动时,运行以下代码:
private GLFWMouseButtonCallback buttonCallback;
...
glfwSetKeyCallback(window, keyCallback = new KeyInput());
现在,每次按下鼠标按钮时都会自动调用invoke。我目前没有使用isButtonPressed()
,只使用isButtonPressedRelease()
。在MouseButInput类之外使用这两个方法来查看是否按下了一个键,唯一的区别是isButtonPressedRelease
需要进入buttons
数组并设置我要检查的按钮的值假的。