2016-11-25 2 views
0

Я работаю над игрой, которая использует спрайты в двухмерном пространстве, и я пытаюсь найти лучший способ остановиться в точном месте.Лучший способ остановиться в точном месте?

Я получил следующее работать:

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)); 

Но это требует от меня, чтобы компенсировать target.getX () на 3 в методе move(), поскольку значения X колеблются между 703 и 697, когда спрайт достигает положения (таким образом, он просто остается дрожащим без логики, которую я включил в метод move()). Есть ли лучший способ двигаться и останавливаться в точном месте?

ответ

1

Просто используйте расстояние до цели. Если расстояние больше, чем скорость, просто двигайтесь как обычно, если расстояние меньше скорости, а просто перемещайте расстояние.

Вам не нужно использовать atan2, sin и cos получить нормированную DeltaX, Y вы можете просто разделить дельты от расстояния. Точно так же, как получить направление и использовать 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; 
    } 
0

Вы экономите направление. Не могли бы вы просто перестать двигаться после того, как направление сдвинется примерно на (!) На 180 градусов?

С другой стороны, может случиться так, что ваша скорость может быть слишком быстрой (в других случаях), поэтому вы не будете переходить через 3, а может быть 300 пикселей, поэтому, когда вы узнаете (с направлением), что вы пробежали мимо цель, вы поворачиваете назад с меньшей скоростью и останавливаете (как я уже отмечал ранее), когда вы снова миновали цель с низкой скоростью.

Смежные вопросы