目前我正在尝试在我正在从事的项目中建立重力系统。但由于某种原因它没有被应用。我是否遗漏或做错了什么?
对于上下文,我使用的是 Box2D 3.0.0。我有下面的重要代码。变量 _props 负责绘制世界。
创造世界:
entitymanager::entitymanager() {
auto worldDef = b2DefaultWorldDef();
worldDef.gravity = {0.0f, -10.0f};
_world = b2CreateWorld(&worldDef);
}
创建身体:
auto bodyDef = b2DefaultBodyDef();
bodyDef.position = {.0f, .0f};
bodyDef.type = b2_dynamicBody;
const auto body = b2CreateBody(_world, &bodyDef);
b2Polygon shape = b2MakeBox(
(width - margin.left - margin.right) * .5f,
(height - margin.top - margin.bottom) * .5f
);
b2ShapeDef shapeDef = b2DefaultShapeDef();
shapeDef.density = p.value("density", 1.f);
shapeDef.friction = 0.3f;
b2CreatePolygonShape(body, &shapeDef, &shape);
在每个游戏循环中我都会这样做:
void entitymanager::update(float_t delta) {
b2World_Step(_world, delta, 4);
for (const auto &entity : _entities) {
entity->update();
}
}
其中实体::更新是:
const auto position = b2Body_GetPosition(_props.body);
_props.position.set(
static_cast<int32_t>(std::round(position.x)),
static_cast<int32_t>(std::round(position.y))
);
_props.angle = b2Rot_GetAngle(b2Body_GetRotation(_props.body));
这是关于舍入和铸造的典型错误。对空间中的位置进行舍入或将分数转换为整数会导致整数丢弃任何小数信息。 发生的情况是,您的增量太小,无法显着更新到新的整数位置。因此,当您对其进行四舍五入时,它将四舍五入到最接近的整数。在这种情况下回到原来的位置。 在位置方面尽量避免四舍五入。您还可以增加重力以查看它何时开始移动。