Ошибка обнаружения столкновений в Box2d

Я хочу обнаружить столкновение между телами, одно тело имеет форму круга, а 30+ имеют выпуклое тело. Может быть, проблема связана с обнаружением столкновения между кругом и выпуклостью? Помогите, не могу найти ответ уже 2 дня... У меня есть 3 класса: Player, ConctactListener и level1(где я создаю многоугольники).

В Player я установил тип kGameObjectPlayer:

    - (id) init {
        if ((self = [super init])) {
            type = kGameObjectPlayer;
        }
        return self;
    }
-(void) createBox2dObject:(b2World*)world {


    b2BodyDef playerBodyDef;
    playerBodyDef.type = b2_dynamicBody;

    playerBodyDef.position.Set(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO);
    playerBodyDef.userData = self;
    playerBodyDef.fixedRotation = true;

    body = world->CreateBody(&playerBodyDef);

    b2CircleShape circleShape;
    circleShape.m_radius = 0.7;
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &circleShape;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 1.0f;
    fixtureDef.restitution =  0.0f;
    body->CreateFixture(&fixtureDef);
}

В ContactListener:

    void ContactListener::BeginContact(b2Contact *contact) {
    GameObject *o1 = (GameObject*)contact->GetFixtureA()->GetBody()->GetUserData();
    GameObject *o2 = (GameObject*)contact->GetFixtureB()->GetBody()->GetUserData();

    if (IS_PLATFORM(o1, o2) && IS_PLAYER(o1, o2)) {
        CCLOG(@"-----> Player made contact with platform!");
    }
}

void ContactListener::EndContact(b2Contact *contact) {
    GameObject *o1 = (GameObject*)contact->GetFixtureA()->GetBody()->GetUserData();
    GameObject *o2 = (GameObject*)contact->GetFixtureB()->GetBody()->GetUserData();

    if (IS_PLATFORM(o1, o2) && IS_PLAYER(o1, o2)) {
        CCLOG(@"-----> Player lost contact with platform!");
    }
}

А на level1 я создаю статические полигоны, которые должны быть землей, с которой должен контактировать игрок.

    - (void) drawStaticPolygons
    {
        GameObject *ground = [[GameObject alloc] init];
        [ground setType:kGameObjectGround];

        //1st polygon
        b2Vec2 vertices1[4];
        vertices1[0].Set(0, 1);
        vertices1[1].Set(0, 0);
        vertices1[2].Set(16, 0);
        vertices1[3].Set(16, 1);

        b2BodyDef myBodyDef1;
        myBodyDef1.type = b2_staticBody;
        myBodyDef1.userData = ground;

        b2PolygonShape polygonShape1;
        polygonShape1.Set(vertices1, 4); 

        b2FixtureDef myFixtureDef1;
        myFixtureDef1.shape = &polygonShape1; //change the shape of the fixture
        myBodyDef1.position.Set(0,0); 
        b2Body *staticBody1 = world->CreateBody(&myBodyDef1);
        staticBody1->CreateFixture(&myFixtureDef1); //add a fixture to the body

        //2nd polygon
        ....
        //n polygon
    }

Вопрос в том, как сообщить ContactListener, что мои полигоны - это kGameObjectGround?


person user1974123    schedule 11.02.2013    source источник
comment
Как вы обнаруживаете столкновение? Чем не работа? Предоставьте код и описание неожиданного поведения.   -  person Pavel    schedule 11.02.2013
comment
Я отредактировал ответ, в ContactListener вроде все в порядке, может быть, я что-то делаю в -(void) drawStaticPolygons. Ничего не происходит, когда игрок спрыгивает со статического полигона, и ничего не происходит, если он приземляется. Класс Player инициализируется типом kGameObjectPlayer, полигонам я задаю тип kGameObjectGround по userData.   -  person user1974123    schedule 12.02.2013


Ответы (1)


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

person MrFVD    schedule 31.03.2014