2016-11-25 52 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( )在move()方法中爲3,因爲當精靈到達位置時X值在703和697之間擺動(因此它僅僅停留在抖動而沒有包含在move()方法中的邏輯)。有一個更好的方法來移動和停止在一個確切的點?

回答

1

只需使用到目標的距離即可。如果距離大於正常移動的速度,如果距離小於速度,則移動距離。

您不需要使用atan2,sincos來獲得標準化的deltaX,Y您可以將deltas除以距離。與獲取方向和使用罪與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像素,所以當你認識到(用方向)你跑過去了目標,當你以低速再次通過目標時,以較小的速度迴轉並停止(如前所述)。

相關問題