我正在写一个精灵,身体以恒定速度移动。所以在时间步骤中就是这样:
const v = body.getLinearVelocity();
v.normalize();
body.setLinearVelocity(v * speed);
然后我想听鼠标点击事件,精灵会相应地移动到新的方向。
这就是我在mouseclicked事件处理程序中所做的事情:
const point = /* new Point on screen */
const rotation = Math.atan2(point.y - player.y, point.x - player.x);
body.setTransform(body.getPosition(), rotation);
但是当我点击鼠标时,我的精灵不会转向新方向,它会以相同的恒定速度向旧方向移动。我可以看到每个时间步都改变了身体的角度。它只是不会走向新的方向。
如何将我的精灵转向Box2D的新方向?
答案 0 :(得分:0)
最好使用applyForce()
和/或applyImpulse()
,因为这会让身体真正移动。 setTransform()
,好吧,#"梁"它是新的变换,没有任何动作。
当您使用apply*
方法时,B2D将计算所有速度,包括角度速度,这将导致逼真的模拟。如果应该发生非现实的事情,应该使用setTransform
或setLinearVelocity
之类的东西。
如果你的身体在整理过程中表现得像真正的那样,你需要计算使它移动到所需的新位置所需的力量,定期
答案 1 :(得分:0)
通过调用b2Body::SetLinearVelocity
方法可以即时更新Velocity。这可能会改变身体速度的大小和/或方向。
仅改变身体的行进方向:
b2Body::GetLinearVelocity
)。b2Vec2
的本地副本旋转到新标题。b2Vec2
(调用b2Body::SetLinearVelocity
)。但请注意,在物理世界中things with mass basically can't instantaneously change their velocities。因此,如果您的精灵具有质量,那么从物理角度来看,以这种方式改变精灵的速度是不太现实的。如果它具有质量,那么正如菲利普所解释的那样,applyForce
或applyImpulse
是用来提供更加真实的速度变化的方法(从物理学的角度来看)。