libgdx - Box2d如何检查子弹位置是否达到目标位置?

时间:2016-07-05 12:23:30

标签: libgdx position box2d velocity projectile

以下链接,我如何使用触摸点将子弹移动到目标位置。 (Move a body to the touched position using libgdx and box2d

我的问题是如果子弹体到达目标位置,我该如何停止子弹体。

我已经尝试了以下代码,并且它正常工作。

PIXEL_TO_METER = 1/32.0f
time step = 1/45.0f, velocity iteration = 6, position iteration = 2
float distanceTravelled = targetDirection.dst(bulletPosition);
if(distanceTravelled >= MAX_DISTANCE){
   // stop
} else {
  // move body
}

但我希望在目标位置停止子弹,也不要在MAX_DISTANCE上停止。但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

您需要检查子弹是否接近目标,足以说明它已达到目标。

    float distance = targetPosition.dst(bulletPosition);
    if(distance <= DEFINED_PRECISION){
        // stop
        // also you can set the target's position to the bullet here
    } else {
        // move body
    }

为什么接近而不是完全?子弹以一定的速度运行,比如 10px /秒。如果您有60fps,则意味着在每个帧中子弹被 10 / 60px 移动。

如果子弹从位置0开始,它的下一个位置(在下一帧中)将是

1/6 (frame 1)
2/6 (frame 2)
3/6 (frame 3)
...

如果目标位于1.5/6位置,您可以看到虽然在frame 1项目符号尚未达到目标,但在下一个框架中它已经通过而且从来没有检测到碰撞。这就是为什么你需要定义一些精度。它的值至少应为 1帧步,因此在这种情况下它应为1/6

    float DEFINED_PRECISION = 1/6f;