如何在box2D世界步骤中获得身体移动的距离?

时间:2017-01-13 04:42:29

标签: java libgdx box2d

我试图为我的游戏循环实现线性插值和固定时间步长。我正在使用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的位置。

谢谢!

2 个答案:

答案 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渲染到新位置,您就会看到以大多数帧速率固定时间步长的平稳移动。