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