使用XNA绘制球飞行

时间:2012-05-15 04:44:36

标签: c# path xna trail

我目前正在使用C#和XNA制作高尔夫球比赛。 到目前为止,我已经能够使球飞行,弹跳和滚动,同时显示位置和速度。 现在我希望能够看到球路径(类似于下面的图像),以便检查整个球的运动。

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

我的代码以固定的时间间隔更新球的位置。我在考虑: 1)使用这些位置, 2)将它们插入VertexPositionColor []数组, 3)并使用GraphicsDevice.DrawUserPrimitives()方法

绘制它们

但到目前为止我没有运气,VertexPositionColor是静态数组,而位置数据的数量总是在增加。

我正在考虑使用List,但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);

    }

我不需要像使用粒子引擎那样的高级效果。只需一行即可。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

C#列表&lt;&gt; class有一个方便的.ToArray()函数,你可以在每次想要绘制基元时调用它。希望有所帮助!

graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineStrip, trailList.ToArray(), 0, trail_amount);

答案 1 :(得分:0)

而不是每个帧都将列表转换为数组,这对我来说效率非常低,您可以计算显示轨迹所需的估计顶点数,创建一个大小的数组并用每个更多的值填充它帧。 (传递给DrawUserPrimitives的参数之一是从数组中绘制的基元数量)

如果你无法计算,你也可以尝试设置路径可以达到的最大长度,这样当它达到那个长度时,它会开始覆盖旧的值。如果相机跟随球,这应该不重要。如果这些解决方案都不符合您的需求,请继续使用ToArray功能。