Как заставить b2body двигаться с постоянной скоростью с box2d - PullRequest
3 голосов
/ 24 сентября 2011

Я играю в box2d, и враги летят с левой стороны экрана на правую сторону экрана. Если я применяю силу в методе тиков, как показано ниже, враги все быстрее перемещаются со временем. Я хочу, чтобы враги двигались в постоянном темпе вместо увеличения их скорости. Как я могу это сделать. Я пробовал импульсы и силы, но они, похоже, не поддерживают постоянную скорость

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

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Просто создайте их с нужной вам скоростью:

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 голос
/ 14 июля 2012

используйте b->SetLinearVelocity(b2Vec2(thisVel, 0));. Если эта постоянная скорость может в конечном итоге измениться на какую-то другую постоянную скорость, вы можете обернуть ее в условное выражение, например

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

Так что вы не применяете одну и ту же скорость каждый тик (хотя вполне возможно, что box2d позаботится об этом за вас, не уверен в этом).

Я столкнулся с той же проблемой, как заставить тела двигаться с постоянной скоростью, и еще одна вещь, которую я рекомендую, это убедиться, что поверхность / среда, по которой движется ваше тело, не имеет трения - таким образом, они никогда не будут замедлите после того, как вы установите их скорость.

...