使用Java检测3D第一人称世界的鼠标移动

时间:2011-12-14 07:25:52

标签: java mouseevent awtrobot

我正在使用Java进行第一人称游戏,我正在尝试让3D运动正常运行。

我的问题是我想抓住鼠标移动,但将鼠标放在窗口内。捕获鼠标移动后,我认为将鼠标放在窗口中的最佳方法是使用Robot.moveMouse(x,y)在移动后将鼠标置于窗口中心。这样可以正常工作,但是机器人的移动会在我的窗口中触发一个事件,然后将其解释为正常事件,从而将我的角色移动到世界中。

我已经尝试了各种保持状态和忽略动作的方案,直到我在中心,但它们看起来都很挑剔,并且不能完全检测用户与机器人控制的事件。

有没有一种简单的方法可以检测出机器人的鼠标移动?

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我通过使用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);
    }
}
相关问题