3

我正在制作一个 box2d 游戏,让敌人从屏幕左侧飞到屏幕右侧。如果我在如下所示的刻度方法中施加力,敌人会随着时间的推移越来越快地移动。我希望敌人以恒定的速度移动,而不是提高他们的速度。我怎样才能做到这一点。我尝试过冲动和力量,但它们似乎并没有保持恒定的速度

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

2 回答 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() );
于 2011-09-24T18:59:01.120 回答
1

使用b->SetLinearVelocity(b2Vec2(thisVel, 0));. 如果这个恒定速度最终可能会改变为其他恒定速度,您可以将其包装在一个条件中,例如

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

这样您就不会在每个滴答声中重新应用相同的速度(尽管 box2d 可能会为您处理这个问题,但对此不确定)。

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

于 2012-07-14T11:52:09.000 回答