Box2D фигуры проваливаются сквозь мир - PullRequest
0 голосов
/ 05 февраля 2012

У меня очень странная проблема с Box2D (под iOS). У меня тело лежит на нижней части экрана. Если я установлю тело с b2_dynamicBody на b2_staticBody, используя body->SetType(b2_staticBody), а затем снова установлю его обратно на b2_dynamicBody, оно провалится через нижнюю часть экрана на короткое мгновение (несколько кадров, как я вижу, оно движется вниз), а затем будет сдвинуто вверх через пол и правильно придя к отдыху.

Такое поведение, кажется, происходит только в нижней части экрана. То же самое с другими телами, сидящими друг на друге, не порождает такого поведения.

Я определяю края экрана следующим образом (screenRect, как уже было отрегулировано для мирового пространства):

b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body* groundBody = globalWorld->CreateBody(&groundBodyDef);
b2PolygonShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundBox;
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p1.y), b2Vec2(screenRect.p2.x,       screenRect.p1.y));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p1.y), b2Vec2(screenRect.p1.x, screenRect.p2.y));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p2.y), b2Vec2(screenRect.p2.x, screenRect.p2.y));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(screenRect.p2.x,screenRect.p2.y), b2Vec2(screenRect.p2.x,       screenRect.p1.y));
groundBody->CreateFixture(&boxShapeDef);

Самое странное, что чем больше я переключаю тело с динамического на статическое, тем дальше и дальше оно падает через пол, прежде чем его толкают обратно.

У меня нет ничего другого в теле, кроме как от динамического к статическому. Если я перемещаю тело и опускаю его обратно на пол, начинаю переключать его с динамического на статический, он сбрасывает, насколько сильно он падает на пол, но он снова нарастает, когда я переключаюсь.

Я не могу понять, почему так падает сквозь пол, если я создаю его неправильно. Все остальное в игре работает отлично.

1 Ответ

0 голосов
/ 01 мая 2012

У меня тоже была эта проблема.Вот моя теория: когда объект статичен, он перестает генерировать контакты с другими статическими объектами, такими как земля.Таким образом, кажется, что при установке на динамический снова не удается обновить эту проверку контактов.

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

b2Vec2 pos = body.getPosition();
float ang = body.getAngle();
b2Vec2 off_map(-100,-100);
body.setPositionAndAngle(off_map, 0);
body.setPositionAndAngle(pos, ang);

Если у вас нет области вне карты, вы можете попробовать деактивировать объект во время первого перемещения.

...