Найдите, какие тела сталкиваются в Box2D, используя C ++ - PullRequest
3 голосов
/ 08 февраля 2011

У меня есть базовый класс для обнаружения столкновений, но я не могу понять, как увидеть, какие тела сталкиваются, чтобы вызвать соответствующее событие.Допустим, у меня есть игра с понгом, а в ней - 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);

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

Ответы [ 2 ]

4 голосов
/ 08 февраля 2011

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

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

b2BodyDef bodyDef;

bodyDef.userData = &myActor;

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

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

b2Fixture* fixtureA = myContact->GetFixtureA();

b2Body* bodyA = fixtureA->GetBody();

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

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

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

0 голосов
/ 14 февраля 2016

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

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

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

        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

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

...