2012-09-26 80 views
2

我正在尝试使用Java/Slick 2D处理图形。我试图让我的精灵旋转到屏幕上的任何位置,然后相应地移动。 我认为最好的方法是跟踪精灵所处的角度,因为我必须将角度的余弦/正弦乘以移动速度,以便让精灵变为“向前”如果是,例如面临45度象限3无法让精灵正确旋转?

但是,在我甚至担心这一点之前,我甚至无法让我的精灵首先旋转。 初步控制台测试显示此代码工作,但应用于精灵时,它只是抽动。任何人都知道什么是错的?

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); 

回答

3

首先,atan2可以得到你正确的角度 - 刚刚从输入删除Math.abs,你将不再需要你的 4,如果您使用纠正角度的象限声明。 (虽然你必须得到减法周围以正确的方式)

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

结合这些建议,我建议是这样的:

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

谢谢!!我的印象是.setRotation()告诉精灵旋转多少,而不是以什么角度。这更有意义,并解释了为什么我尝试过的其他代码组合都不起作用。 – rphello101