使用Box2D的桨运动

时间:2011-01-03 14:10:14

标签: flash actionscript-3 game-engine box2d

我正在制作像Arkanoid这样的游戏并用鼠标移动船只,我使用以下代码:

var mousex:int = costume.stage.mouseX;
if (mousex < paddleWidth/2)
    mousex = paddleWidth/2;
else if (mousex > PhysiVals.STAGE_WIDTH - paddleWidth/2)
    mousex = PhysiVals.STAGE_WIDTH - paddleWidth / 2;

var idealLocation:Point = new Point(mousex, ypos);

var directionToTravel:b2Vec2 = new b2Vec2((idealLocation.x -> costume.x) * PhysiVals.paddleSpeed, idealLocation.y-costume.y);

directionToTravel.Multiply(1 / PhysiVals.RATIO);

directionToTravel.Multiply(30);

body.SetLinearVelocity(directionToTravel);

那里的一切都很好!球拍正在以它应有的方式移动!问题是我想要朝着它移动的方向稍微倾斜,当它停止移动时,倾斜角应该变为零。我尝试使用角速度,但我不知道如何做到这一点!所以请帮忙!

1 个答案:

答案 0 :(得分:1)

身体的角速度是它的旋转速度,如果我没记错的话,Box2D以弧度/秒为单位测量它。因此,如果将其设置为1,您应该看到缓慢旋转。

body.SetAngularVelocity(1);

(如果你不这样做,可能意味着我对单位的错误,或者可能意味着你对身体有一个约束,阻止它旋转。)

然而,听起来您希望身体移动到特定角度。有一个函数SetXForm,它允许你指定一个新的位置和角度,但是如果你使用它,那么你将搞乱联系系统,Box2D建议不要使用它,除非一个项目真正地从一个地方传送到另一个地方。

你的桨没有这样做,所以也许你可以试试这个。

body.SetAngularVelocity((targetAngle - body.GetAngle()) * x);

x这是一个控制旋转速度的常数。将其设置为剪辑的FPS将使主体在框架内以正确角度捕捉。将其设置得更低会导致更慢,更平滑的旋转到所需的角度,但它也会使身体的旋转更容易受到与其他身体接触的影响。

同样的技巧可以将身体移动到设定的目标位置,但它更详细:

var delta:b2Vec2 = new b2Vec2(target.x, target.y);
delta.Subtract(body.GetPosition());
delta.Multiply(x);
body.SetLinearVelocity(delta);

不言而喻,如果在阻止运动的方式中存在其他静态物体,这些都不会起作用。另外,通过使用其中任何一个,你将覆盖Box2D正在生成的角度/线性速度,这意味着你将面对模拟的粒度。

警告:代码未经过测试,并且是从内存中编写的