Box2D World.GetBodyList () возвращает NULL, но мир явно обновляет объекты - PullRequest
0 голосов
/ 29 мая 2020

Недавно реализована основная ветка (не удалось получить выпуск 2.3.1 для CMake) Box2D в проект для быстрой 2D-физики и обнаружения столкновений. Все работает нормально, но когда я пришел к использованию функции "World.GetBodyList ()", она вернула NULL. Это кажется странным, потому что я знаю, что мир правильно обновляет 2 тестовых объекта, которые я создал, поскольку объект Dynami c падает на объект stati c и балансирует сверху.

У меня есть только 1 мировой объект, и это статический c указатель.

private:
        inline static b2World* s_world;

World Init

void Box2DWrapper::Box2DInit(glm::vec2 gravity)
    {
        b2Vec2 gravityVec = { gravity.x, gravity.y };
        s_world = new b2World(gravityVec);
    }

Как создаются тела.

b2Body* Box2DWrapper::CreateRigidbodyBox(glm::vec2 position, glm::vec2 halfDimensions, bool isStatic, float objectDensity, float frictionCoefficient, float restitution, int16_t collisionGroup, Layers myCategories, Layers collisionCategories, bool fixedRotation, float angularDampening, float linearDampening, bool fastDynamicBulletCollisionCheck)
    {
        b2BodyDef newBodyDef;
        newBodyDef.position = { position.x, position.y };
        newBodyDef.angularDamping = angularDampening;
        newBodyDef.linearDamping = linearDampening;
        newBodyDef.fixedRotation = fixedRotation;
        newBodyDef.bullet = fastDynamicBulletCollisionCheck;
        if (!isStatic)
            newBodyDef.type = b2_dynamicBody;
        b2Body* boxBody = s_world->CreateBody(&newBodyDef);
        b2PolygonShape box;
        box.SetAsBox(halfDimensions.x, halfDimensions.y);
        b2FixtureDef boxDef;
        boxDef.shape = &box;
        boxDef.density = objectDensity;
        boxDef.friction = frictionCoefficient;
        boxDef.restitution = restitution;
        boxDef.filter.groupIndex = collisionGroup;
        boxDef.filter.categoryBits = static_cast<uint16_t>(myCategories);
        boxDef.filter.maskBits = static_cast<uint16_t>(collisionCategories);
        boxBody->CreateFixture(&boxDef);
        return boxBody;
    }

Это возвращает nullptr.

b2Body* current = s_world->GetBodyList();

Не уверен, что это вся соответствующая информация, так как я не очень разбираюсь в Box2D. Скажите, пожалуйста, если чего-то не хватает.

1 Ответ

0 голосов
/ 25 августа 2020

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

Это может быть суть.

У меня была такая же проблема, и у меня была Установлено 2 версии Box2D. Один в системе и один в моей локальной папке. Я связался с локальной версией, но использовал системные заголовки. Но функция GetBodyCount встроена и почему-то не соответствует связанной версии.

Поэтому убедитесь, что вы ссылаетесь на ту же библиотеку, из которой вы берете файлы заголовков. После того, как я изменил это, я снова мог использовать GetBodyCount()

...