Box2D мировой размер - PullRequest
       9

Box2D мировой размер

3 голосов
/ 05 ноября 2011

Я создал мир box2d, и я хотел ограничить высоту мира.Я выполнил поиск в Google и, по-видимому, в предыдущей версии box2d была опция, в которой вам нужно было бы определить размер вашего мира, но я не уверен, что вы смогли установить высоту мира, но в текущей версии они имеютполностью отключил эту опцию.

Так что я просто ищу способ ограничить высоту, так как мой игрок - это шар, который прыгает вверх и вниз, и я хочу ограничить, насколько высоко он может прыгать (прыжки выполняются физикой и гравитацией, искорость мяча, так что после нескольких хороших прыжков, мяч прыгает очень высоко, так как его скорость увеличивается, и я не хочу ограничивать скорость) и накладываем границу, скажем, y=900.

1 Ответ

6 голосов
/ 05 ноября 2011

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

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

        // for the screenBorder body we'll need these values
        CGSize screenSize = [CCDirector sharedDirector].winSize;
        float widthInMeters = screenSize.width / PTM_RATIO;
        float heightInMeters = screenSize.height / PTM_RATIO;
        b2Vec2 lowerLeftCorner = b2Vec2(0, 0);
        b2Vec2 lowerRightCorner = b2Vec2(widthInMeters, 0);
        b2Vec2 upperLeftCorner = b2Vec2(0, heightInMeters);
        b2Vec2 upperRightCorner = b2Vec2(widthInMeters, heightInMeters);

        // static container body, with the collisions at screen borders
        b2BodyDef screenBorderDef;
        screenBorderDef.position.Set(0, 0);
        b2Body* screenBorderBody = world->CreateBody(&screenBorderDef);
        b2EdgeShape screenBorderShape;

        // Create fixtures for the four borders (the border shape is re-used)
        screenBorderShape.Set(lowerLeftCorner, lowerRightCorner);
        screenBorderBody->CreateFixture(&screenBorderShape, 0);
        screenBorderShape.Set(lowerRightCorner, upperRightCorner);
        screenBorderBody->CreateFixture(&screenBorderShape, 0);
        screenBorderShape.Set(upperRightCorner, upperLeftCorner);
        screenBorderBody->CreateFixture(&screenBorderShape, 0);
        screenBorderShape.Set(upperLeftCorner, lowerLeftCorner);
        screenBorderBody->CreateFixture(&screenBorderShape, 0);

Примечание. Этот код предназначен для Box2D v2.2.1.Я предполагаю, что это то, что вы используете, потому что вы сказали «предыдущая версия», которая требовала, чтобы этот код был написан по-другому (с помощью метода SetAsEdge).

...