我正在尝试旋转一个精灵,让它说它是一把枪,通过在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;
答案 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
。