2016-11-25 12 views
0

私は、2次元空間でスプライトを活用するゲームに取り組んでいます。私は、正確な位置で停止するより良い方法を見つけようとしています。正確な点で停止する方がいいですか?

私は仕事に以下を得ている:(

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

しかし、これはtarget.getXを相殺するために私を必要とします。ここでは

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

は、私はメソッドに与えている引数です)をmove()メソッドで3回増やすと、X値が703〜697の間で移動し、スプライトがその位置に到達すると(move()メソッドに含まれているロジックなしにジッタが残ります)正確な位置に移動して停止するより良い方法はありますか?

答えて

1

ターゲットまでの距離を使用してください。距離が速度よりも大きい場合は、距離が速度よりも小さい場合は距離を移動します。

あなたは、あなただけの距離によってデルタを分割することができ、Y、正規化されたDELTAXを取得するにはatan2sincosを使用する必要はありません。方向を取得し、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ピクセルになる可能性があるため、過去に走ったと認識したときターゲットは、あなたが低速でターゲットを再び通過したときに、より小さなベロシティで戻り、停止します(前述のように)。

関連する問題