2

Java/Slick 2D を使用してグラフィックを操作しようとしています。マウスが画面上にある場所にスプライトを回転させ、それに応じて移動させようとしています。これを行う最善の方法は、スプライトの角度を追跡することであると考えました、たとえば象限 3で45 度に面しています。

しかし、それを心配する前に、そもそもスプライトを回転させることさえできません。予備のコンソール テストでは、このコードが機能することが示されましたが、スプライトに適用すると、わずかにピクピクします。誰が何が悪いのか知っていますか?

int mX = Mouse.getX();
int mY = HEIGHT - Mouse.getY();
int pX = sprite.x;
int pY = sprite.y;
int tempY, tempX;
double mAng, pAng = sprite.angle;
double angRotate = 0;

if (mX != pX) {
    tempY = pY - mY;
    tempX = mX - pX;
    mAng = Math.toDegrees(Math.atan2(Math.abs((tempY)), Math.abs((tempX))));

    if (mAng == 0 && mX <= pX)
        mAng = 180;
}
else {
    if (mY > pY)
        mAng = 270;
    else
        mAng = 90;
}

// Calculations
if (mX < pX && mY < pY) { // If in Q2
    mAng = 180 - mAng;
}
if (mX < pX && mY > pY) { // If in Q3
    mAng = 180 + mAng;
}
if (mX > pX && mY > pY) { // If in Q4
    mAng = 360 - mAng;
}

angRotate = mAng - pAng;
sprite.angle = mAng;
sprite.image.setRotation((float) angRotate);
4

1 に答える 1

3

まず、atan2正しい角度を取得できます。入力から削除するだけで、角度の象限を修正するために使用する3Math.absつの4つのifステートメントは必要ありません。(減算を正しい方法で取得する必要がありますが)

次に、スプ​​ライトの回転をに設定します。これは、 「古い角度-新しい角度」mAng - pAngに相当します。したがって、実際には、角度自体ではなく、前回から角度が変化した量(この目的には意味がありません)に回転を設定しています。

これらの提案を組み合わせて、次のようなものをお勧めします。

mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
sprite.angle = mAng;
sprite.image.setRotation((float) mAng);
于 2012-09-26T18:15:39.940 に答える