Я хочу обнаружить столкновение между телами, одно тело имеет форму круга и 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?
Как вы обнаруживаете столкновение? Что не работает? Предоставьте код и описание неожиданного поведения. – Pavel
Я отредактировал ответ, в ContactListener, похоже, все в порядке, возможно, я что-то делаю в (void) drawStaticPolygons. Ничего не происходит, когда игрок прыгает с статического полигона и ничего, если он приземляется. Класс Player инициализируется с использованием типа kGameObjectPlayer, для полигонов я задал тип kGameObjectGround по userData. – user1974123