c++ - Box2D 对象位置不会受到速度变化的影响

标签 c++ box2d

我以前使用过 Box2D,所以我正在使用的这段代码已经在另一个项目中发挥作用,唯一的主要区别是世界不是作为参数传递的,而是作为全局指针给出的。

当我应用线性速度(我已经尝试过从 1 到 99999 但仍然没有)时,甚至连 Obj1->Body2D->GetPosition().x; 获取它的世界位置都没有;将有任何变化。

主要内容:

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);
}

最佳答案

根据评论中的对话...如果未调用世界 Step 方法,则对象位置将不会更新。

添加这样的调用:

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

将其置于一个循环中,以根据对象的属性(如速度)更新对象位置。

iforce2d 产生了 a tutorial on Box2D worlds (包括使用他们的 step 方法)我推荐给任何想要了解更多关于 Box2D b2World 类的人。

希望这对您有所帮助!

关于c++ - Box2D 对象位置不会受到速度变化的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53796868/

相关文章:

c++ - 如何使用 CMake 将外部库( boost )包含到 CLion C++ 项目中?

C++运算符重载顺序

android - 如何使用 onTouchListener 拖放主体并仍然处于物理世界中?和引擎

objective-c - Xcode:Cocos2d:无法使用 Box2D 创建世界

c++ - QSystemTrayIcon激活信号: DoubleClick without Trigger

c++ - Qt:如何检测一个widget是否被选中?

C++11, `noexcept` 说明符,定义与声明

java - 使用box2d制作动画

Java 和 Box2D - 哪个物体应该被视为子弹?

graphics - WebGL/Box2D绘图问题: gap between bodies