私は Java で一人称シューティング ゲームを開発しています。マウスの動きによってプレイヤーが回転するコントロールを実装したいと考えています。ただし、Java では、イベントを使用してしかマウス座標を取得できないためMouseListener
、マウス カーソルがモニターの端から離れると座標が変化しなくなり、プレーヤーのビューを回転させることができなくなります。
それを行う方法に関するヒント/提案はありますか? ありがとう。
私は Java で一人称シューティング ゲームを開発しています。マウスの動きによってプレイヤーが回転するコントロールを実装したいと考えています。ただし、Java では、イベントを使用してしかマウス座標を取得できないためMouseListener
、マウス カーソルがモニターの端から離れると座標が変化しなくなり、プレーヤーのビューを回転させることができなくなります。
それを行う方法に関するヒント/提案はありますか? ありがとう。
java.awt.Robot
AerandiR が提案するように使用してみましたが、いくつかの問題に遭遇しました。他の人も同じように遭遇する可能性があるため、詳しく説明します。
カーソルを 1 つの位置 (できれば画面の中央) に保持することが目標である場合はrobot.mouseMove(width/2, height/2);
、メソッドの最後で次のようなものを呼び出す必要がありますmouseMoved()
。この実装では、マウスが中心から外れるたびに、 はマウスを中心Robot
に戻します。
ただし、Robot
マウスを再び中央に移動すると、プレーヤーは元の場所に戻ります。実際には、プレーヤーは元の位置と回転した位置の間で吃音します。
これを修正するには、マウスが現在ある場所と以前の場所との差をプレーヤーがオンにする距離を定義する代わりに、中心からの距離として定義します。
そのようです:turnAmountX += e.getX() - width/2;
これでRobot
、マウスを再度中央に移動すると、e.getX() - width/2
常にゼロになります。
要約:
void mouseMoved(MouseEvent e) {
turnAmountX += e.getX() - width/2;
turnAmountY += e.getY() - height/2;
robot.mouseMove(this.getLocationOnScreen().x + width/2,
this.getLocationOnScreen().y + height/2;
}
一部のゲームでは、マウス移動イベントごとにカーソルが画面の中央に戻り、マウス イベントの対応する大きさと方向でビューが移動します。カーソルを中央に配置する前に、カーソル位置の画面中央へのオフセットを計算することで、そのベクトルを取得できます。カーソルを画面の中央に戻すには、java.awt.Robotクラスを使用してみてください。
ファースト パーソン シューティング ゲームを作成しているので、中央にロックされたカーソルを非表示にして、プレイヤーが狙う場所に独自の十字線を描画することをお勧めします。これには、以前のマウス移動イベントの現在の合計に基づいて、カーソルがどこにあるべきかを追跡することも含まれます。
ビューがマウスの開始位置に対して相対的に移動し続ける動作を実現したい場合 (マウスの移動が停止しても)、以前のすべてのマウス移動ベクトルの移動合計を保持し、それに応じてビューを 1 回移動することができます。すべてのフレーム。ただし、これはファースト パーソン シューティング ゲームよりもフライト シミュレーターのようなものに当てはまる可能性があります。