Изменения скорости не влияют на положение объекта Box2D - PullRequest
0 голосов
/ 15 декабря 2018

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

Когда я применяю линейную скорость (которую я уже пробовал от 1 до 99999 и все еще ничего), даже позиция в мире, получающая ее с помощью Obj1->Body2D->GetPosition().x;, не изменится.

Main:

GameObject Obj1 = new GameObject(iVec2(500), iVec2(30));
void Update() {
    Obj1->b2_body->SetLinearVelocity(b2Vec2(5, 0));
    //Still same Position on Obj1
    //Camera Update
    Obj1->Render(*Renderer);
}

Сценарий 1:

std::unique_ptr<b2World> World = std::make_unique<b2World>(b2Vec2(0.0f, 9.81f));

Сценарий 2:

extern std::unique_ptr<b2World> World;

GameObject::GameObject(iVec2 position, iVec2 size, Texture sprite, iVec3 color)
    :Position(iVec2(position.x / 128.0f, position.y / 128.0f)), Size(iVec2(size.x / 128.0f, size.y / 128.0f)) {
        this->RenderPosition = position;
        this->RenderSize = size;

        b2BodyDef b2d_BodyDef;
        b2d_BodyDef.type = b2_dynamicBody;
        b2d_BodyDef.position.Set(Position.x, Position.y);
        b2d_Body = World->CreateBody(&b2d_BodyDef);

        b2PolygonShape b2d_BoxShape;
        b2d_BoxShape.SetAsBox(Size.x / 2, Size.y / 2);

        b2FixtureDef b2d_FixtureDef;
        b2d_FixtureDef.shape = &b2d_BoxShape;
        b2d_FixtureDef.density = 1.0f;

        b2d_Fixture = b2d_Body->CreateFixture(&b2d_FixtureDef);
    }

void GameObject::Render(Renderer2D & renderer) {
        float tempPosX = this->b2d_Body->GetPosition().x;
        float tempPosY = this->b2d_Body->GetPosition().y;
        this->RenderPosition = iVec2((tempPosX - Size.x / 2) * 128.0f, (tempPosY - Size.y / 2) * 128.0f);
        this->RenderSize = iVec2(Size.x * 128.0f, Size.y * 128.0f);
        renderer.Render(this->Sprite, this->RenderPosition, this->RenderSize, this->RealRotation, this->Color);
}

1 Ответ

0 голосов
/ 18 декабря 2018

Согласно разговору в комментариях ... если метод world Step не вызывается, то позиции объекта не будут обновляться.

Добавить вызов как:

World->Step(timeStep, velocityIterations, positionIterations);

Поместите его в цикл, чтобы заставить позиции объектов обновляться на основе их свойств, таких как их скорости.

iforce2d выпустил учебник по мирам Box2D (включая использование метода их шагов), которыйЯ рекомендую всем, кто хочет больше узнать о классе Box2D b2World.

Надеюсь, это поможет!

...