Найдите, какие тела сталкиваются в Box2D, используя C++

У меня есть базовый класс для обнаружения столкновений, но я не могу понять, как увидеть, какие тела сталкиваются, чтобы вызвать соответствующее событие. Допустим, у меня есть игра в понг, и в ней есть ballBody и topwallBody. Как бы я понял, если они сталкиваются или нет. Вот класс, который я использую, чтобы дать вам представление.

class MyListener : public b2ContactListener
{
    void BeginContact(b2Contact* contact)
    {
        b2Fixture* fixtureA = contact->GetFixtureA();
        b2Fixture* fixtureB = contact->GetFixtureB();
        b2Body* body1 = fixtureA->GetBody();
        b2Body* body2 = fixtureB->GetBody();
        cout << "started";
    }
    void EndContact(b2Contact* contact)
    {
        cout << "ended\n";
    }
};
MyListener listener;
world.SetContactListener(&listener);

Похоже, я могу получить тела в указателях, но я понятия не имею, как сравнить их с другими телами.


person recharge330    schedule 07.02.2011    source источник
comment
Этот вопрос выглядит как хороший кандидат на gamedev.stackexchange.com.   -  person James    schedule 08.02.2011


Ответы (2)


Когда вы создаете тела, установите пользовательские данные на что-то значимое, но будьте последовательны :) Хороший совет — всегда иметь один и тот же вид и тип данных, идентификатор объекта или ссылку на актера. .

Прямо из документации:

b2BodyDef bodyDef;

bodyDef.userData = &myActor;

Итак, если вы пойдете по этой дороге, вы получите актера от b2Body и сообщите ему о столкновении или сделаете что-то еще.

Также из документов:

b2Fixture* fixtureA = myContact->GetFixtureA();

b2Body* bodyA = fixtureA->GetBody();

MyActor* actorA = (MyActor*)bodyA->GetUserData();

В приведенном выше коде у вас будет актор/сущность, и вы сможете делать все, что захотите... actorA.explode().

Последовательность, скорее всего, спасет вас от безумия. Если кто-то вставит туда все виды данных, станет очень сложно понять, какие данные находятся в каком теле. Кроме того, вы не можете обрабатывать контакты каким-либо универсальным способом.

person Skurmedel    schedule 07.02.2011

Ответ, который дал Скурмедель, очень помог мне в этом. Я подумал, что добавлю немного информации о том, что я делал, чтобы решить эту проблему.

Я, как и ОП, хотел проверить, что во что попало. У меня есть сердца, подпрыгивающие внутри стен игрового экрана, и я хотел знать, попадают ли они в другие сердца или стены.

Я использовал этот код для просмотра контакта

        world.setContactListener(new ContactListener() {
        @Override
        public void beginContact(Contact contact) {

            Gdx.app.log("GameScreen", "Contact Made! Fixture A: " + contact.getFixtureA().getBody().getUserData().toString());
            Gdx.app.log("GameScreen", "Contact Made! Fixture B: " + contact.getFixtureB().getBody().getUserData().toString());
        }

И в моем сердечном объекте я переопределил метод toString, чтобы пока просто возвращать «Hear». Я устанавливаю userData для тела как весь объект спрайта, поэтому у меня есть гибкость с телом в самом объекте.

Не имея фактических ссылок на класс для пола, стен и потолка, я просто устанавливаю userData как «Floor» и т. д.

GameScreen: Contact Made! Fixture A: Ground
GameScreen: Contact Made! Fixture B: Heart

Используя этот метод и увеличив его позже, я смогу изменить реакцию объектов в зависимости от того, с кем они контактируют.

person Verdant Drift    schedule 14.02.2016