Java 如何获取实体在box2D世界步中移动的距离?

Java 如何获取实体在box2D世界步中移动的距离?,java,libgdx,box2d,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。模

我正在尝试为我的游戏循环实现线性插值和固定的时间步长。我正在使用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来检查我在两个物理步骤之间的距离,这样我就可以插值精灵的位置


谢谢

Body的
getPosition
方法正在返回引用-这意味着您不按值复制它,而只将position对象上的“指针”指定给
old\u pos
/
new\u pos
。但是,您在
步骤
之前分配一次,然后在
步骤
之后分配一次。总之,这两个变量都保持相同的对象,并且在
步骤
之后具有状态

您需要做的是按值复制位置向量-为此,您可以使用向量的
cpy()
方法

您的代码应该如下所示

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 <代码>不复制整个对象(但是它不应该真正影响你的性能)。我想添加一些我在尝试让它工作时发现的信息,我希望在开始时就知道这些信息

如果你打算在物理计算中使用固定的时间步长(你应该这样做),你也应该在物理步长之间插入(或外推)精灵的位置。在我的代码中,屏幕的渲染频率高于世界的步进频率:

@Override
public void render(float delta) {

    accumulator+=delta;
    while (accumulator>=STEP_TIME){
        accumulator-=STEP_TIME;
        stepWorld();
    }
    alpha = accumulator/STEP_TIME;
    update(delta);
    //RENDER using alpha
}
若要避免对移动对象进行抖动渲染,请在其位置渲染精灵或纹理(由alpha修改)。因为alpha是累加器与步进时间的比率,所以它始终在0和1之间

然后你需要知道你的身体在一步中移动了多少。这可以通过接受的答案或使用身体速度来完成:

newPos = oldPos + body.getLinearVelocity()*STEP_TIME*alpha

然后只需在新位置渲染Sprite,就可以看到固定时间步长在大多数帧速率下的平滑移动。

尝试
printLog(new\u pos.x)
printLog(old\u pos.x)
,这些值是什么?它们会更新,但它们总是一样的:I/OUT::-54.899673 I/OUT::-54.899673 I/OUT:--I/OUT::-54.229126 I/OUT:--I/OUT::-53.55858 I/OUT::-53.55858 I/OUT:--注意新的和旧的_pos是多么的相同?是的,它们不应该不同吗?是的,它应该根据您的要求而定,但很明显,这涉及到一个循环,只要存储循环外的“old_pos”。您提供的代码有限,因此很难看到发生了什么。这很有意义,谢谢。我会尝试一下。