2013-02-11 3 views
0

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

В игрока я установить тип 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!"); 
    } 
} 

И в ровном1 я создаю статичные многоугольников, которые должны быть с которой игрок shoul d контакт.

- (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?

+0

Как вы обнаруживаете столкновение? Что не работает? Предоставьте код и описание неожиданного поведения. – Pavel

+0

Я отредактировал ответ, в ContactListener, похоже, все в порядке, возможно, я что-то делаю в (void) drawStaticPolygons. Ничего не происходит, когда игрок прыгает с статического полигона и ничего, если он приземляется. Класс Player инициализируется с использованием типа kGameObjectPlayer, для полигонов я задал тип kGameObjectGround по userData. – user1974123

ответ

0

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

Смежные вопросы