我正在制作像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);
那里的一切都很好!球拍正在以它应有的方式移动!问题是我想要朝着它移动的方向稍微倾斜,当它停止移动时,倾斜角应该变为零。我尝试使用角速度,但我不知道如何做到这一点!所以请帮忙!
答案 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正在生成的角度/线性速度,这意味着你将面对模拟的粒度。
警告:代码未经过测试,并且是从内存中编写的