1

我正在使用 Java 开发第一人称游戏,并且正在尝试使 3D 运动正常工作。

我的问题是我想捕捉鼠标移动,但将鼠标保持在窗口内。捕获鼠标移动后,我认为将鼠标保持在窗口中的最佳方法是使用 Robot.moveMouse(x,y) 将鼠标移动后在窗口中居中。这很好用,但是机器人的移动会在我的窗口中触发一个事件,然后将其解释为正常事件,从而在世界上移动我的角色。

我尝试了各种保持状态并忽略运动的方案,直到我处于中心位置,但它们看起来都很挑剔,并且不能完全检测到哪些事件是用户控制的还是机器人控制的。

有没有一种简单的方法来检测鼠标移动来自机器人?

是否有更简单的方法来解决我忽略的问题?

4

2 回答 2

1

我通过使用 JOGL 2.0 RC4 切换到 NEWT 解决了这个问题。特别是,我使用 GLWindow 和 warpPointer 而不是带有 Robot.mouseMove 的 AWT 框架。使用开关,我立即获得流畅的动作。一些类似于我正在做的示例代码(里程可能会有所不同):

public class MyClass implements MouseListener {
    private GLWindow window;
    private int centeredX = -1;
    private int centeredY = -1;

    // ...

    public void mouseMoved(MouseEvent e) {
        if (centeredX == -1 || centeredY == -1) {
            center();
            return;
        }

        int deltaX = e.getX() - centeredX;
        int deltaY = e.getY() - centeredY;

        // ... Do something with the deltas

        centeredX = window.getWidth() / 2;
        centeredY = window.getHeight() / 2;
        window.warpPointer(centeredX, centeredY);
    }
}
于 2011-12-16T09:34:08.297 回答
0

好吧,我对此不是 100% 的,但是您是否在鼠标事件中使用了getsource()or函数?getComponent()他们可能会将机器人作为它的来源返回。除此之外,我会有一个类变量boolean robotControlling,只要它控制鼠标,就将其设置为 true。然后,在你的 mouseListener 中,做一个if(!robotControlling){...}. 希望这可以帮助。

编辑:如果您的应用程序中有未使用的鼠标按钮(Java 有按钮 1、按钮 2 和按钮 3),您可以让机器人按下它,并在鼠标侦听器中忽略任何按下该代码的事件。(evt.getButton()用于此)当然,这不是最干净的解决方案:P

于 2011-12-14T07:41:58.550 回答