0

現在、C# と XNA を使用してゴルフ ボール ゲームを作成しています。これまでのところ、位置と速度を表示しながら、ボールを飛ばし、跳ねさせ、転がすことができました。ここで、ボールの動き全体を確認するために、ボールのパス (下の画像と同様) を確認できるようにしたいと考えています。

http://www.golf-simulators.com/images/ms4.jpg

私のコードは、一定の時間間隔でボールの位置を更新します。私は考えています:1)これらの位置を使用し、2)VertexPositionColor []の配列に挿入し、3)GraphicsDevice.DrawUserPrimitives()メソッドを使用して描画します

VertexPositionColor は静的配列ですが、位置データの量は常に増加しています。

リストを使用することを考えていますが、 GraphicsDevice.DrawUserPrimitives() メソッドはそれを入力として受け取ることを拒否します

    protected override void Draw(GameTime gameTime)
    {

    trail_vertice = new VertexPositionColor;
    trail_vertice.Position = Position;
    trail_vertice.Color = Color.Black;
    trail_amount += 1;
    trailList.Add(trail_vertice);

    basicEffect.CurrentTechnique.Passes[0].Apply();
    graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineStrip, trailList, 0, trail_amount);

    }

パーティクル エンジンなどの高度なエフェクトは必要ありません。1行だけで十分です。なにか提案を?

4

2 に答える 2

1

C#List <>クラスには、プリミティブを描画するたびに呼び出すことができる便利な.ToArray()関数があります。お役に立てば幸いです。

graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineStrip, trailList.ToArray(), 0, trail_amount);
于 2012-05-15T07:57:40.723 に答える
0

フレームごとにリストを配列に変換するのは非常に非効率に思えますが、トレイルを表示するために必要な頂点の推定数を計算し、そのサイズの配列を作成して、フレームごとにより多くの値で埋めることができます。(DrawUserPrimitives に渡す引数の 1 つは、配列から描画するプリミティブの数です)

これを計算できない場合は、トレイルが到達できる最大の長さを設定して、その長さに達すると古い値をオーバーライドし始めることもできます。カメラがボールを追いかける場合、これはあまり問題になりません。これらの解決策のいずれもニーズに合わない場合は、先に進んで ToArray 関数を使用してください。

于 2012-05-15T10:26:00.807 に答える