【问题标题】:Java Read Raw Mouse InputJava 读取原始鼠标输入
【发布时间】:2015-05-03 00:04:30
【问题描述】:

我正在寻找一种在 Java 中读取原始鼠标输入的方法,而不仅仅是事件侦听器。我会告诉你我在做什么。本质上,有一个游戏,如果您将鼠标向右移动,我希望 Java 发送“d”键被按下的键信号,当鼠标向左移动时,“a”键被按住向下。但是,当您移动鼠标时,游戏会迅速纠正鼠标位置并将其发送回屏幕中间。因此,如果您使用鼠标侦听器,您会得到一个鼠标向右移动的事件,然后是另一个快速跟随鼠标向左移动的事件。我想知道是否可以在不进行位置更正的情况下从鼠标获取数据。谢谢!

【问题讨论】:

    标签: java input mouseevent mouse


    【解决方案1】:

    一些代码可能会使情况更清楚,但您可以这样做。

    虽然有许多 API(例如 LWJGL 的鼠标接口)允许您直接轮询鼠标位置,但在您的情况下听起来像是过度编程。首先,保留一个引用最后鼠标位置的私有字段。我们在这里称它为x

    使用 MouseMotionListener,并让它从 mouseMovedmouseDragged 调用相同的方法。该方法应如下所示。

    void controlMethod(MouseEvent event) {
        int newX = event.getXOnScreen();
        int dx = this.x - newX;
        if(dx > 0) **D Key Event**
        else if(dx < 0) ***A Key Event**
    
        x = newX;
    }
    

    这应该可以为您完成工作。您可能需要注意的唯一一件事是鼠标偏离了 MouseMotionListener 的区域;但总有办法绕过这样的事情,而且似乎有点切题。

    最后一点,如果您在游戏循环开始时鼠标控制出现剧烈波动,请考虑将类字段 x 设置为 Optional,并将 Optional.ifPresent(...) 用于 dx逻辑。这也将保护您免受数据无效(例如焦点丢失)的影响,我建议您将其作为一种实践。

    祝你好运!

    【讨论】:

    • 澄清一下,这不是我在玩的游戏。游戏是 CSGO,这就是将鼠标位置修改回屏幕中心的原因。如果这有任何意义:)
    • 这确实改变了一些事情。所以,你真的需要一个 MouseMotionListener 以外的东西。我建议查看 LWJGL API 以及 JInput;任何一个都应该能够轮询绝对鼠标位置。我不确定 CSGO 将鼠标光标拉回的速度有多快,所以我的建议到此结束,但这些可能是你最好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2016-02-02
    相关资源
    最近更新 更多