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

时间:2011-09-24 17:23:42

标签: xcode cocos2d-iphone box2d box2d-iphone physics-engine

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

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

使用b->SetLinearVelocity(b2Vec2(thisVel, 0));。如果这个恒定速度最终可能会因某些其他恒定速度而改变,则可以将其包装在条件中,例如

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

这样你就不会在每个刻度上重新应用相同的速度(虽然box2d可能会为你处理这个,但不确定)。

我遇到了如何使身体以恒定速度移动的相同问题,我推荐的另一个问题是确保你的身体正在移动的表面/介质是无摩擦的 - 这样他们就永远不会设定速度后减速。