Обнаружение движения мыши для трехмерного мира от первого лица на Java - PullRequest
1 голос
/ 14 декабря 2011

Я работаю над игрой от первого лица на Java и пытаюсь заставить работать трехмерное движение.

Моя проблема в том, что я хотел бы зафиксировать движение мыши, но держать мышь внутри окна. После того, как я зафиксировал движение мыши, я решил, что лучший способ удержать мышь в моем окне - центрировать мышь в окне после перемещения, используя Robot.moveMouse (x, y). Это работает нормально, однако движение от робота вызывает событие в моем окне, которое затем интерпретируется как нормальное событие, и, таким образом, перемещает моего персонажа в мире.

Я пробовал различные схемы сохранения состояния и игнорирования движений до тех пор, пока не окажусь в центре, но все они кажутся привередливыми и не совсем определяют, какие события управляются пользователем против робота.

Есть ли простой способ обнаружить движение мыши от робота?

Возможно, есть более простой способ решить мою проблему, которую я пропускаю?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

Я решил это, переключившись на NEWT с JOGL 2.0 RC4. В частности, я использую GLWindow и warpPointer вместо AWT Frame с Robot.mouseMove. С помощью переключателя я мгновенно получил плавные движения. Пример кода, похожего на то, что я делаю (пробег может отличаться):

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);
    }
}
0 голосов
/ 14 декабря 2011

Ну, я не на 100% об этом, но вы использовали функции getsource() или getComponent() для события мыши?Они могут вернуть робота в качестве источника.За исключением этого, у меня была бы переменная класса, например boolean robotControlling, и в любое время, когда она контролирует мышь, установите для нее значение true.Затем, в вашем mouseListener, сделайте if(!robotControlling){...}.Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: если у вас в приложении неиспользуемые кнопки мыши (на Java есть кнопка 1, кнопка 2 и кнопка 3), вы можете заставить робота нажимать это, а в слушателе мыши игнорировать любые события.с этим кодом нажата.(используйте evt.getButton() для этого) Конечно, это не совсем чистое решение: P

...