2010-11-22 5 views
6

私はタッチベースのゲームで作業しており、ユーザーが触れたパスを描画する際に問題が発生しています。 私はこれらのアプリのようなものを模倣しようとしていますhttp://www.youtube.com/watch?v=G3CECr6mT1Qまたはhttp://www.youtube.com/watch?v=r34-_0wrVC42点間のパスを描く

私はXNA/C#でこれをやっています。

私の問題はです:私は、ユーザーのタッチパスを定義するウェイポイントのセットを持っています。私はどのように私はこれらの点の間に様式化された線を得ることができなかったので、私は "ちょっと、私はちょうど '線'である本当に小さな画像を持って、ウェイポイント間のすべてのスポットでそれを描画し、私はこの2つのポイントの間のすべての座標を取得する方法がわからなかったので、私は立ち往生した。 2番目、など最初からベクトルが、私は任意の提案

。数学が正しい得るように見えるか助けカント? ありがとう!

答えて

5

2点間の中間点を計算するには、ある点から他の点への方向ベクトルとその点間の距離を求めます。 t = 0が第1の点に対応し、t = 0.5がそれらの間の中間であり、t = 1が第2の点に対応する、0と1との間の因子tによる距離の縮尺。次に、この値で方向ベクトルをスケールし、元の点にそれを加えます。

Vector2 IntermediatePoint(Vector2 p0, Vector2 p1, float t) 
{ 
    Vector2 delta = p1 - p0; 

    float distance = delta.Length(); 

    if (distance == 0.0f) 
    { 
     return p0; 
    } 
    else 
    { 
     Vector2 direction = delta/distance; 

     return p0 + direction * (distance * t); 
    } 
} 

p0とp1の間に複数のポイントを計算する場合は、距離と方向を1回だけ計算してください。

XNA RoundLineを使用してポイントを接続することもできます。

もう1つの提案はset up a textured rotated quadです。

+0

+1です。 –

+0

Empyrean - 感謝!それは魅力のように働いた!とても有難い!あなたのコードが多かれ少なかれXNAがプリミティブを描くのと同じかどうか、あるいは私がperfヒットしているかどうかを知っていますか?また、私はコードスニペットを投稿して、誰かが将来このスレッドでベンチャーを開始するようにします。さらに、roundLineは本当にクールに見える、私はそれをチェックアウトします。 – Steve

+0

ベクトルの長さを計算することは、費用のかかる操作です。しかし、あなたがここでやっていることに対してあまりにも高額ではありません。 XNAはライン描画プリミティブの一部としてこれを行いません。ただし、線画プリミティブの使用はお勧めしません。あなたの質問で示唆するように、それは全くカスタマイズできません。 – Empyrean

0

は、単純な描画する方法の詳細については、http://create.msdn.com/en-US/education/catalog/sample/primitivesでサンプルをチェックラインを含む「プリミティブ」。

+0

ありがとうございます。それを見て、私は自分のラインをもっと魅力的なものにカスタマイズすることができませんでした。私が見つけた唯一のカスタマイズはカラーオプションでした。私は彼らがXNAに描画のための計算をたくさんしていると思うので、彼らがどのようにそれを行ったかについての数学を見ることができません。 RoundLineの場合は – Steve

1
pointA = waypointsToDraw.ElementAt(i); 
pointB = waypointsToDraw.ElementAt(i + 1); 
deltaVector = pointB - pointA; 
distance = deltaVector.Length(); 
direction = deltaVector/distance; 
for (int z = 1; z < distance; z++) 
{ 
    newPoint = pointA + direction * (distance * (z/distance)); 
    //this is the newPoint - it will be every point/pixel between pointA and pointB. Put drawing code here 

} 

上記のコードサンプル。 PointAとpointBは2つのエンドポイントであり、newPointはそれらの間のすべてのポイントになります

+0

私はzをfloat型にすることを勧めます。最適なパフォーマンスを得るために数学演算で型を混在させないようにしてください。 – Empyrean

+0

フィードバックいただきありがとうございます、私はそれを念頭に置くでしょう。学習のエクササイズを続けるために、ベジエ曲線やcatmull-romスプラインを上記に適用したいのであれば、これを上記のように微調整するのは簡単でしょうか? :) – Steve

関連する問題