如何使用Box2d让b2body以恒定速度移动

3

我正在制作一个基于box2d的游戏,敌人从屏幕左侧飞到右侧。如果我像下面的代码一样在tick方法中应用力量,敌人会随着时间增加而越来越快。我希望敌人能以恒定的速度移动,而不是增加速度。我尝试了冲量和力量,但它们似乎不能保持恒定的速度。

b2Vec2 forceA = b2Vec2(15, -b->GetMass() * world->GetGravity().y);
b->ApplyForce(forceA, b->GetWorldCenter() );
2个回答

2

只需按照您想要的速度创建它们:

b2BodyDef bDef;
...
bDef.linearVelocity = myVelocity;
b2Body *b = world->createBody(&bDef);

如果它们没有受到外力的作用,它们将根据牛顿第一定律保持它们的速度。如果存在重力,则每个步骤都会施加力:

b2Vec2 forceA = b2Vec2(0, -b->GetMass() * world->GetGravity().y);
b->ApplyForce(forceA, b->GetWorldCenter() );

1

使用b->SetLinearVelocity(b2Vec2(thisVel, 0));。如果这个恒定速度最终可能会被其他恒定速度替换,您可以将其包装在条件语句中,例如

if(b->GetLinearVelocity().x != 0){ 
    b->SetLinearVelocity(b2Vec2(0, 0));
}

这样,您就不会在每个时钟周期重新应用相同的速度(虽然 box2d 可能已经替您处理了此问题,我不确定)。

我遇到了如何使物体以恒定速度移动的同样问题,我建议的另一件事是确保身体移动的表面/介质是无摩擦的 - 这样,它们在设置了速度后就永远不会减速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接