所以我的屏幕是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英尺的任何地方,以及.10-.20
对我来说,检测到毫米级的移动至关重要。现在,如果你要告诉我降低速度,那么运动对我来说太慢了。无论如何强制对象注册更多的像素,旅行时的坐标,所以我可以更精确地停止它?
答案 0 :(得分:1)
我会假设您只对立即停在目标位置而不是放慢速度感兴趣。我也假设你只是在x方向上移动而你对y分量不感兴趣。
解决此问题的一种简单方法是找到当前位置与目标位置之间的距离。因此,如果你在(10,10)并且你的目标是(20,10),那么距离将是10.假设你以180单位/秒的速度移动,这意味着3个单位/帧@ 60 fps。应该很清楚,你将无法在目标停留,因为3帧太快而4帧太长。相反,我们需要在帧之间进行插值,以确定我们是否可以在帧期间达到目标。
这不是太难,我们知道我们有多快,我们知道我们当前的位置,我们知道我们想去哪里。在第三帧,我们将在(19,10),我们的目标是(20,10)。 Math.abs(20-19)&lt; 3,因此我们可以将位置设置为(20,10)并将我们的速度设置为0。
这只是您遇到的问题的一种解决方案,但却是最简单的问题之一。希望它有所帮助:)