1

所以我的屏幕是 1280x720,设置如下:

static final float BOX_STEP=1/60f;  
static final int BOX_VELOCITY_ITERATIONS=6;  
static final int BOX_POSITION_ITERATIONS=2;  
static final float WORLD_TO_BOX=0.01f;  
static final float BOX_TO_WORLD=100f;

如您所见,我在这里使用非常正常的参数。我将物体的速度设置如下:

    if(screenX - slimeBody.getPosition().x * BOX_TO_WORLD > 0)
        velocity = 8;
    else
        velocity = -8;

    slimeBody.setLinearVelocity(velocity, 0);
            target = screenX;

但后来我想停在给定的点,我使用以下功能:

if(slimeBody.getPosition().x * BOX_TO_WORLD +10 > target && slimeBody.getPosition().x * BOX_TO_WORLD < target)
        slimeBody.setLinearVelocity(0,0);

现在我不喜欢使用它,因为它在快速左右移动对象时会产生抖动。这是因为在我为对象设置速度的那一刻,它运行得如此之快,以至于跳过了大量的坐标,以像素为单位在 10-20 的任何地方说话,以 0.10-.20 的米为单位

对我来说,检测到毫米的运动至关重要。现在,如果你要告诉我降低速度,那么对于我的目的来说,移动太慢了。无论如何强制对象注册更多的像素,旅行时的坐标,以便我可以更精确地停止它?

4

1 回答 1

0

我将假设您只对立即停在目标位置而不是放慢速度感兴趣。我还将假设您只是在 x 方向上移动,并且您对 y 分量不感兴趣。

解决这个问题的一个简单方法是找到你当前位置和目标位置之间的距离。因此,如果您在 (10, 10) 并且您的目标是 (20, 10),则距离将为 10。假设您以 180 个单位/秒的速度移动,这意味着 3 个单位/帧 @ 60 fps。应该很清楚,您将无法在目标处停下来,因为 3 帧太快而 4 帧太长。相反,我们需要在帧之间进行插值,以确定我们是否可以在“帧期间”达到我们的目标。

这并不难,我们知道我们要走多快,我们知道我们当前的位置,我们知道我们想去哪里。在第三帧,我们将在 (19, 10),我们的目标是 (20, 10)。Math.abs(20 - 19) < 3,因此我们可以将位置设置为 (20, 10) 并将速度设置为 0。

这只是您面临的问题的一种解决方案,但却是最简单的一种。希望能帮助到你 :)

于 2013-07-19T15:57:31.490 回答