2011-10-24 4 views
3

Я вижу, все говорят, что вы добавите гравитацию как и в Box2D мире:Box2D Гравитация по конкретному объекту?

b2Vec2 gravity = b2Vec2(0.0f, -10.0f); 
bool doSleep = false; 
world = new b2World(gravity, doSleep); 

Дело в том, однако, что если я хочу гравитацию только на определенном b2Body, который содержит USERDATA из CCSprite? AFAIK это применит гравитацию ко всему миру, чего я не хочу, так может кто-нибудь объяснить мне, как я могу применить эту гравитацию только к конкретному b2Body?

Спасибо!

Edit1: Могу ли я просто сделать эту линию,

_bottomBody->ApplyForce(gravity, _bottomBody->GetPosition()); 

Вместо мирового = новый b2World ... и т.д. ... Будет не то, что работа с гравитацией только на этом b2Body?

ответ

4

Просто применяйте силу/импульс к конкретному b2Body для каждого кадра. Он будет эмулировать гравитацию.

// a procedure called every frame 
void Application::on_update_world(double t) 
{ 
    m_body_with_custom_gravity->applyForce(CUSTOM_GRAVITY * m_body_with_custom_gravity->getMass()); 

    m_phys_world->Step(t, VEL_ITERATIONS, POS_ITERATIONS); 
} 

Нить с вопросом тесно связан ваш: How to apply constant force on a Box2D body?

+0

Как так? Я просто предпочел бы использовать способ выше, есть ли способ изменить мой код выше только для применения к одному объекту? –

+1

Ваше приложение, несомненно, имеет цикл кадров, то есть процедуру/метод, где вы вызываете b2World :: step(). Внутри этой процедуры вам нужно вызвать метод applyForce для указанного тела. См. Пример кода в этом ответе. –

+0

Мое приложение не имеет цикла кадров. Мое приложение Box2d Смешанно с Cocos2d, смешанным с Obj C. Я просто использую цикл игры Cocos2D, который вызывается каждую секунду, что означает, когда просмотр обновляется. Проверьте Edit 1 в моем исходном сообщении, если этот код будет работать для меня. –