我试图为我的游戏循环实现线性插值和固定时间步长。我正在使用libGDX引擎和box2D。我试图在这样的世界步骤中找到模拟移动我角色身体的数量:
old_pos = guyBody.getPosition();
world.step(STEP_TIME, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
new_pos = guyBody.getPosition();
printLog(new_pos.x-old_pos.x);
每次返回0。模拟工作正常,身体肯定会移动每一步。
附加代码:
@Override
public void render(float delta) {
accumulator+=delta;
while (accumulator>=STEP_TIME){
accumulator-=STEP_TIME;
stepWorld();
}
alpha = accumulator/STEP_TIME;
update(delta);
//RENDER
}
private void stepWorld() {
old_pos = guyBody.getPosition();
old_angle = guyBody.getAngle() * MathUtils.radiansToDegrees;
world.step(STEP_TIME, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
new_angle = guyBody.getAngle() * MathUtils.radiansToDegrees;
new_pos = guyBody.getPosition();
}
我尝试使用alpha来检查物理步骤之间的距离,以便我可以插入Sprite的位置。
谢谢!
答案 0 :(得分:1)
Body' getPosition
方法正在返回Vector引用 - 这意味着您不是按值复制它而只是指定"指针"在位置对象上old_pos
/ new_pos
。但是,您要在step
之前分配一次,然后在step
之后将所有变量全部保存为同一个对象,而step
之后的状态为cpy()
。
您需要做的是按值复制位置向量 - 为此,您可以使用Vector old_pos = guyBody.getPosition().cpy();
world.step(STEP_TIME, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
new_pos = guyBody.getPosition().cpy();
printLog(new_pos.x-old_pos.x);
方法。
您的代码应该是
y
如果你不使用x
坐标,你还应该考虑只保留浮点类型变量中的{{1}}以不复制整个对象(但它不应该真正影响你的性能)。
答案 1 :(得分:0)
虽然接受的回复确实回答了我的问题,但我想在尝试将其发挥作用时添加一些我想知道的信息。
如果您要使用固定的时间步长进行物理计算(您应该这样做),您还应该在物理步骤之间插入(或外推)Sprite的位置。在我的代码中,屏幕渲染的频率高于世界的步骤:
newPos = oldPos + body.getLinearVelocity()*STEP_TIME*alpha
为了避免抖动渲染移动物体,在其位置渲染精灵或纹理,由alpha修改。由于alpha是累加器与步进时间的比率,因此它总是在0和1之间。
然后你需要找到你的身体在一步中移动了多少。这可以通过接受的答案或使用体速来完成:
List<Tuple<int, int>> table
然后只需将Sprite渲染到新位置,您就会看到以大多数帧速率固定时间步长的平稳移动。