在一个确切的点停止的更好方法?

Better way to stop at an exact point?

我正在开发一款利用二维精灵 space 的游戏,我正试图找到一种更好的方法来在精确的点停止。

我已经完成了以下工作:

public void target(boolean hasTargetIn, Point target) {

    if (hasTarget) {
        deltaX = target.getX() - this.mPos.getX();
        deltaY = target.getY() - this.mPos.getY();
        mDirection = Math.atan2(deltaY,deltaX);

        mVelocityX = Math.cos(mDirection) * mSpeed;
        mVelocityY = Math.sin(mDirection) * mSpeed;
    }
    hasTarget = hasTargetIn;

}

public void move(Point target) {

    if (mPos.getX() != target.getX() + 3 && mPos.getY() != target.getY() + 3) {

        this.mPos.x += mVelocityX;
        this.mPos.y += mVelocityY;
    }
}

以下是我为该方法提供的参数:

 sprite.target(true, new Point(700,305));
 sprite.move(new Point(700,305));

但这需要我在 move() 方法中将 target.getX() 偏移 3,因为当精灵到达该位置时 X 值在 703 和 697 之间波动(因此它只是保持在那里抖动而不我在 move() 方法中包含的逻辑)。有没有更好的方法在精确点移动和停止?

您保存方向。方向改变大约(!) 180 度后,您不能简单地停止移动吗?

另一方面,您的速度可能会太快(在其他情况下),因此您不会超过 3 个像素,但可能超过 300 个像素,因此当您认识到(方向)您 运行 越过目标,你以较小的速度返回并在你再次以较低的速度通过目标时停止(正如我之前提到的)。

只需使用到目标的距离。如果距离大于速度,则正常移动,如果距离小于速度,则仅移动距离。

您不需要使用 atan2sincos 来获得归一化的 deltaX,Y,您只需将 delta 除以距离即可。与获得方向和使用 sin 和 cos 相同。

    deltaX = target.getX() - this.mPos.getX();
    deltaY = target.getY() - this.mPos.getY();
    // get the distance
    mDist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
    if(mDist > 0){
        if(mDist < mSpeed){
            mVelocityX = deltaX;
            mVelocityY = deltaY;
        }else{
            mVelocityX = (deltaX / mDist) * mSpeed;
            mVelocityY = (deltaY / mDist) * mSpeed;
        }
   }else{
        mVelocityX = 0;
        mVelocityY = 0; 
   }