我使用Box2D制作了一款汽车游戏[在Flash中]我还有一个剩余的bug,我无法修复。我添加了图形并将它们放在Box2D机身的顶部。一切都和预期的一样好,但在X旋转之后,车轮的电影剪辑停止旋转。我这样做wheelSprite.rotation = wheelBody.GetAngle() * 180 / Math.PI
。我运行了一个单独的程序,我看到了,如果你做X.rotation += variable
并且每帧增加变量,在~30 000(变量值)之后MovieClip停止旋转,所以我在~28 000之后将其重置为0 。 我该怎么办? wheelBody.GetAngle()
不断上升,我需要它才能让它看起来真实。我该如何重置它?
答案 0 :(得分:4)
我前段时间遇到过这个问题。解决方案是:
rotation = newRotation % 2*Math.PI;
这意味着旋转必须介于0到360度之间(0 - 2 * PI)。
答案 1 :(得分:2)
剩余部分解决了这个问题:
yourMC.rotation = (yourMCbody.GetAngle() * 180 / Math.PI) % 360;
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/operators.html#modulo
答案 2 :(得分:0)
你不能使用SetAngle()函数将角度设置为等效角度吗?
ie:如果角度旋转超过360度,请将其设置为0?
答案 3 :(得分:0)
Box2D手册指定身体的旋转是无限制的,并且可能会在一段时间后变大,你可以使用SetAngle
重置它。
我使用while循环来计算规范化角度(你可以用浮点操作数调用模数,但我不知道这对性能是否有害)。此代码将角度标准化为0 <= angle < 2pi
,但我看到角度有时也会标准化为-pi <= angle < pi
。
const 2PI:Number = Math.PI * 2;
var rotation:Number = wheelBody.GetAngle();
// normalize angle
while(rotation >= 2PI)
rotation -= 2PI;
while(rotation < 0)
rotation += 2PI;
// store the normalized angle back into Box2D body so it doesn't overflow (optional)
wheelBody.SetAngle(rotation);
// convert to degrees and set rotation of flash sprite
wheelSprite.rotation = rotation * 180 / Math.PI;
我没有将代码收集到函数中,但这样做很容易。