Libgdx Box2d Body 直线方向移动?

Libgdx Box2d Body move in a linear direction?

我制作了一个 body,我想在单击按钮时移动它,我已经能够使用 body.setLinearVelocity() 移动 body,但它不准确。假设我想以 40 的线性 X 速度移动我的 body 七米,我该怎么做?

//BODY MOVEMENT
//timer = I try to move the body for a certain amount of time
/*isMoveRight and isMoveLeft are Just booleans for activating and deactivating movement*/
        if(Gdx.input.isKeyJustPressed(Input.Keys.RIGHT)){
            timer = 0f;
            isMoveRight = true;
            isMoveLeft = false;
        }else if(Gdx.input.isKeyJustPressed(Input.Keys.LEFT)){
            timer = 0f;
            isMoveLeft = true;
            isMoveRight = false;
        }

        if(isMoveRight == true && timer < 0.1f){
            timer += 1f * delta;   //activate timer
            body.setLinearVelocity(52f, 0f);
        }else if(isMoveLeft == true && timer < 0.1f){
            timer += 1 * delta;
            body.setLinearVelocity(-52f, 0f);
        }

我可以只使用 body.setTransform() 但我需要 body 来实际移动而不是传送。提前谢谢你

我不知道你的代码示例有多完整,但从我在这里看到的情况来看,你至少错过了在 0.1 秒后将速度重置为 0 的部分。

else {
    body.setLinearVelocity(0F, 0F);
}

除此之外,您的方法在移动距离方面有轻微的模糊性,因为取决于您的帧速率,您的检查 timer < 0.1f 不是很准确:

timer = 0.099 -> distance = 5.148
timer = 0.132 -> distance = 6.881 (one frame later with 30 frames/second)

一些(未经测试的)想法如何处理这个问题:

  1. 使用 RopeJoint 强制 body 和起点之间的最大距离(在这种情况下也必须是 body)
  2. 测量距离(使用Vector2 class)并在需要时将其传送回最大距离的点。 (无论如何你应该使用距离而不是计时器)
  3. 如果接近目标,请放慢 body 速度,这至少有助于减少误差