2011-07-14 11 views
0

私は現在、A * pathfinding関数の結果からポイント(x、y)の配列を持っています。この配列は、最初のインデックスが文字に最も近いポイントであり、次のインデックスがパスで移動する必要がある次のポイントになるように設定されます。ポイントの配列間で文字を確実に移動するにはどうすればよいですか?

これらの点がグリッド上にある(現在のグリッド上の各点間の8個のピクセルが、これはchangableです。)彼はその時点で到着したとき

私の現在の戦略は、最初のポイントに文字を移動することですそれから、次のものに移動してください。

文字からそのポイントまでのベクトルを作成し、それがどこまであるかを調べることで、最初のポイントに移動します。それから私は角度を見つけ、その方向に動く。

// How the character is moved 
double xMove = Math.cos(charAngle * (Math.PI/180)) * 0.1 * delta; 
double yMove = Math.sin(charAngle * (Math.PI/180)) * 0.1 * delta; 

x += xMove; 
y += yMove; 

absVx -= Math.abs(xMove); 
absVy -= Math.abs(yMove); 

absVXabsVyストア絶対距離を移動したまま、それを移動後ごとにデクリメントされます。それらが両方ともゼロ以下の場合、目的地に到達したので、配列から削除し、次のポイントですべてを再計算します。

私には2つの問題があります。

  1. 時にはキャラクターがポイントを飛ばしてから、永遠に移動します。これは、ゲームエンジンが動き(滑らかな)に加えるデルタに起因する可能性が高く、キャラクターがあまりにも遠くに動くので、私はこのキャラクターについてはわかりません。

  2. これは、宛先を1回クリックするとうまくいきますが、必要なのはマウスボタンを押し続けることだけです。私がマウスを押したままにすると、現在のところ、キャラクターは最初のポイントで単に「立っている」だけです。

私は2番目の問題の解決策を考えましたが、それは良いことではありません。最後のマウスクリックから移動したい場所を保存しますが、移動先のポイントを渡すまで実際には計算しません。

だから、私は本当に賢いと楽しい誰かがこのことについて私と少し会話を持っていることを願って:D

答えて

2

について1、おそらく原因は、丸め問題です。これらのxMove/yMoveを追加すると小さなエラーが発生し、xとyは実際には宛先の値を取得しないため、アルゴリズムは実行を継続します。解決する

方法:それは誤り

の度合いがときに "、宛先に到着する文字になります「チック」どのように多くの

2を見つけることができますので、

1は、「目的地に到達した」の定義キャラクタの位置をその行き先に強制する(これにより、蓄積されたエラーを修正することが可能になる)。

また、私はグラフィックスの理論に戻るでしょう。 IIRCでは、ポイント間を移動するパスは、Bresenhamのライン描画アルゴリズムと同じでなければなりません。後の段階では、あなたのキャラクターはパスに沿ってBスプラインをたどることができます。

+0

私はこの秋にコンピュータグラフィックスを開始します:)ポインタをありがとう! –

+0

私はブレーゼンハムのラインを作り、それに沿ってキャラクターを動かしました。ありがとう。 –

関連する問題