Box2D 对象位置不会受到速度变化的影响
Box2D object position won't be affected by velocity changes
我以前使用过 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(包括使用他们的步骤方法),我推荐给任何想要了解更多关于 Box2D 的人 b2World
class.
希望对您有所帮助!
我以前使用过 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(包括使用他们的步骤方法),我推荐给任何想要了解更多关于 Box2D 的人 b2World
class.
希望对您有所帮助!