プレイヤーの画像をマウスカーソルの方向に向けたい。このコードを使用して、マウス カーソルの位置を取得します。
private int cursorX = MouseInfo.getPointerInfo().getLocation().x;
private int cursorY = MouseInfo.getPointerInfo().getLocation().y;
注:デフォルトのプレイヤー画像は上向きです
回転角を計算するには、三角法を使用する必要があります。そのためには、まず画像とカーソルの位置を取得する必要があります。これは異なる場合があるため、画像の位置を取得する方法はわかりません。この例 (ここから適応) では、 と が画像の位置であると仮定imageX
します。imageY
x
y
float xDistance = cursorX - imageX;
float yDistance = cursorY - imageY;
double rotationAngle = Math.toDegrees(Math.atan2(yDistance, xDistance));
座標 (0,0) から別の座標 (x,y) への角度を見つけるには、三角関数 tan^-1(y/x) を使用できます。
Java のクラスは、tan^-1 関数 (「arctangent」、したがって「atan」とも呼ばれます) として機能し、ラジアンMath
で角度を返す静的メソッドを指定します。(引数を1つ取るメソッドがあります。リンク先のJavadocを参照してください。)atan2
atan
「プレーヤー」の座標からマウスカーソルの座標までの角度を度単位で見つけるには(あなたが言及したこの「プレーヤー」にはx座標とy座標があると仮定します)、次のようなことをする必要がありますこれ:
double theta = Math.atan2(cursorY - player.getY(), cursorX - player.getX());
また、ゼロ ラジアンの角度は、マウスがプレーヤーのすぐ右にあることを示していることにも注意してください。「デフォルトのプレーヤー画像」が上を向いているとあなたは言います。回転する前に、画像がプレーヤーに対して上向きであることを意味する場合、ジオメトリと Java 実装ではatan2
、「デフォルトで」プレーヤーが右を向くようにするのがより一般的です。
これは2年前に尋ねられましたが...
ウィンドウ内のマウス位置を更新し続けるためにマウスが必要な場合は、mouseMotionListenerを参照してください。マウスの位置を取得するために使用する電流は、画面全体に対して相対的です。それを覚えておいてください。
それ以外の場合は、ここに私が使用する方法があります。
public double angleInRelation(int x1, int y1, int x2, int y2) {
// Point 1 in relation to point 2
Point point1 = new Point(x1, y1);
Point point2 = new Point(x2, y2);
int xdiff = Math.abs(point2.x - point1.x);
int ydiff = Math.abs(point2.y - point1.y);
double deg = 361;
if ( (point2.x > point1.x) && (point2.y < point1.y) ) {
// Quadrant 1
deg = -Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));
} else if ( (point2.x > point1.x) && (point2.y > point1.y) ) {
// Quadrant 2
deg = Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));
} else if ( (point2.x < point1.x) && (point2.y > point1.y) ) {
// Quadrant 3
deg = 90 + Math.toDegrees(Math.atan(Math.toRadians(xdiff) / Math.toRadians(ydiff)));
} else if ( (point2.x < point1.x) && (point2.y < point1.y) ) {
// Quadrant 4
deg = 180 + Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));
} else if ((point2.x == point1.x) && (point2.y < point1.y)){
deg = -90;
} else if ((point2.x == point1.x) && (point2.y > point1.y)) {
deg = 90;
} else if ((point2.y == point1.y) && (point2.x > point1.x)) {
deg = 0;
} else if ((point2.y == point2.y) && (point2.x < point1.x)) {
deg = 180;
}
if (deg == 361) {
deg = 0;
}
return deg;
}
つまり、下の図に示すように、各 θ の角度を取得し、x または y が 0 であるかどうかを確認し、その特別なケースを作成します。
原点は画像の中央で、各点 (手描きの十字でマーク) はマウスの位置です。