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可以为您获得正确的角度 - 只需Math.abs从输入中删除,您就不需要用于校正角度象限的三个四个 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 回答