当前位置: 首页 > 知识库问答 >
问题:

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

萧鸿轩
2023-03-14
if (glfwGetKey(window, key) == GLFW_PRESS)
if (glfwGetKey(windowm key) == GLFW_RELEASE)

谢谢:)

共有1个答案

齐运诚
2023-03-14

因此,我解决了这个问题,这要归功于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()方法只是告诉场景图中需要输入的节点(即播放器)查询该输入。

 类似资料:
  • 第六课:键盘和鼠标 欢迎来到第六课! 我们将学习如何通过鼠标和键盘来移动相机,就像在第一人称射击游戏中一样。 接口 这段代码在整个课程中多次被使用,因此把它单独放在一个文件中:common/controls.cpp,然后在common/controls.hpp中声明函数接口,这样tutorial06.cpp就能使用它们了。 和前节课比,tutorial06.cpp里的代码变动很小。主要的变化是:每

  • 入门和简单示例 热键有时也称为快捷键, 因为它们能简便地触发动作 (例如运行程序或 键盘宏). 在下面的例子中, Win+N 被设置为启动记事本. 磅的符号 [#] 表示 Windows 键, 它被称为 修饰符: #n:: Run Notepad return 在前面的最后一行中,return 用来结束此热键。不过, 如果热键只需要执行单行语句, 那么此行可以直接放在双冒号的右边. 换句话说,re

  • 目前为止,我们的脚本都没有交互。也就是说,它们都不需要用户的输入。本节,我们将学习脚本如何问问题,并获取以及使用其响应。 read 要从键盘读取输入,使用 read 命令。read 命令从键盘读取输入并将其赋值给一个变量。例如: #!/bin/bash echo -n "Enter some text > " read text echo "You entered: $text" 注意 ech

  • 问题内容: 如何在Python中控制鼠标和键盘? 这个想法与Java中的Robot()类相同。可以说:将鼠标从此处移至此处,单击此处,然后将其写在屏幕上。 对于Windows,有win32api,但我主要使用Linux。 对于Linux,有Xlib,但它也适用于键盘吗?(仅找到对鼠标的引用) 有跨平台的解决方案吗?(Linux,Windows甚至OS X都很棒。) 问题答案: 对于鼠标,我发现py

  • 我正在开发一个javafx扫雷游戏,目前只使用鼠标左键输入。我想用鼠标右键也让用户可以标记可能的炸弹。我查看了Button类的Oracle网页,它说: “当按下并释放按钮时,将发送ActionEvent。应用程序可以通过实现EventHandler来处理ActionEvent来执行基于此事件的某些操作。按钮也可以通过实现EventHandler来处理MouseEvent来响应鼠标事件。” http

  • 键盘/鼠标/触摸板 [HW] atkbd.set={2|3} 设置atkbd驱动(CONFIG_KEYBOARD_ATKBD)的键盘类型:2(默认值)表示AT键盘;3 表示PS/2键盘。 [HW] atkbd.reset 在初始化AT或PS/2键盘时重置键盘状态。常用于解决从休眠状态唤醒后键盘失效的故障。 [HW] atkbd.softraw={0|1} 当键盘按键被按下时,是返回原始的扫描码(S