1

私はJavaで一人称ゲームに取り組んでおり、3Dの動きを働かせようとしています。

私の問題は、マウスの動きをキャプチャしたいのに、マウスをウィンドウ内に保持したいということです。マウスの動きをキャプチャした後、Robot.moveMouse(x,y) を使用して、移動後にマウスをウィンドウの中央に配置することが、マウスをウィンドウ内に保持する最善の方法であることがわかりました。これは正常に動作しますが、ロボットからの動きがウィンドウ内のイベントをトリガーし、それが通常のイベントとして解釈されるため、ワールド内でキャラクターが動きます。

中央に来るまで状態を維持し、動きを無視するさまざまなスキームを試しましたが、それらはすべて扱いにくいようで、どのイベントがユーザーとロボットによって制御されているかを完全に検出しません。

マウスの動きがロボットからのものであることを検出する簡単な方法はありますか?

私が見落としている問題を解決する簡単な方法はありますか?

4

2 に答える 2

1

JOGL 2.0 RC4 で NEWT に切り替えることでこれを解決しました。特に、Robot.mouseMove で AWT フレームの代わりに GLWindow と warpPointer を使用します。スイッチを入れると、すぐに滑らかな動きになりました。私がやっていることに似たいくつかのサンプルコード(マイレージは異なる場合があります):

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()または関数を使用しましたか? getComponent()彼らはロボットをそのソースとして返すかもしれません。それがなければ、次のようなクラス変数がboolean robotControllingあり、マウスを制御するたびにそれをtrueに設定します。次に、mouseListener で、if(!robotControlling){...}. お役に立てれば。

EDIT:アプリケーションに未使用のマウスボタンがある場合(Javaにはボタン1、ボタン2、ボタン3があります)、ロボットにそれを押させ、マウスリスナーでそのコードが押されたイベントを無視することができます。(evt.getButton()これに使用)もちろん、それは最もクリーンなソリューションではありません:P

于 2011-12-14T07:41:58.550 に答える