无法让精灵正确旋转?

时间:2012-09-26 17:52:30

标签: java rotation sprite angle slick2d

我正在尝试使用Java / Slick 2D来玩图形。我试图让我的精灵旋转到鼠标在屏幕上的任何地方,然后相应地移动。 我认为最好的方法是跟踪精灵所处的角度,因为我必须将角度的余弦/正弦乘以移动速度,以便让精灵去“前进”< / em>即使它是,例如在象限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);

1 个答案:

答案 0 :(得分:3)

首先,atan2可以为您获得正确的角度 - 只需从输入中删除Math.abs,您就不需要 四个if语句用于纠正角度的象限。 (虽然你必须以正确的方式得到减法)

其次,您将精灵的旋转设置为mAng - pAng,相当于“旧角度 - 新角度”。所以实际上你将旋转设置为自上次以来角度改变了多少(这对于此目的没有意义),而不是角度本身。

结合这些建议,我建议这样的事情:

mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
sprite.angle = mAng;
sprite.image.setRotation((float) mAng);