如何将精灵旋转到一个点?

时间:2014-09-05 02:22:30

标签: c++ algorithm sfml trigonometry

我正在尝试旋转一个精灵,让它说它是一把枪,通过在360°(右侧或左侧取决于该点更接近的哪一侧)的最小路线来旋转,并且我'我有一些问题。

在一个圆圈上,它从359°跳到0°所以我不能直接使用我的目标角度 - 当前角度。

请记住,我正在使用SFML,因此当isRotating为真时,它正在执行每帧的功能。

这是我可以获得的信息:

//The angle in degrees of my sprite
float currentAngle = pSprite.getRotation();
//The angle is needs to be once the rotation is over
float targetAngle = float(atan2(deltaY,deltaX) * 180 / (atan(1)*4) + 180);

我正在使用速度变量来增加或减少每帧的角度值。

distance = Speed*Time.asSeconds();
currentAngle += distance;

1 个答案:

答案 0 :(得分:1)

首先,找出差异:

diff = target - current

diff是"短"角度(导致旋转较短的角度),或者长度为#34;角度(在另一个方向上旋转更长)。请注意:

  • 您永远不需要旋转超过(作为绝对值)180度从一个角度到另一个角度。

  • "短"角度和"长"角度有相反的符号(+/-),它们的绝对值加到360.

示例:0 - 359 = -359。这是" long"角度。我们知道这是因为它的绝对值是> 180."短"角度将具有相反的符号,其绝对值将与359相加至360,因此它为1。

计算这个的简单方法是:

while (diff < -180) 
    diff += 360;
while (diff > 180)
    diff -= 360;

diff现在是您正在寻找的角度。因此,如果它是负数,则将你的速度乘以-1。

如果角度不在while中,if(而不是[0, 360])就会出现 - 例如,您有current = 1440, target = 359