我目前正在使用 C# 和 XNA 制作高尔夫球游戏。 到目前为止,我已经能够让球飞行、弹跳和滚动,同时显示位置和速度。 现在我希望能够看到球的路径(类似于下图),以便检查整个球的运动。
http://www.golf-simulators.com/images/ms4.jpg
我的代码以固定的时间间隔更新球的位置。我在想:
但到目前为止我还没有运气,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);
}
我不需要像使用粒子引擎这样的高级效果。只需一行就足够了。有什么建议吗?
C# List<> 类有一个方便的 .ToArray() 函数,您可以在每次想要绘制图元时调用该函数。
graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineStrip, trailList.ToArray(), 0, trail_amount);
无需每帧将列表转换为数组(在我看来效率非常低),您可以计算显示轨迹所需的估计顶点数,创建该大小的数组并在每帧中填充更多值。 (传递给 DrawUserPrimitives 的参数之一是要从数组中绘制的图元数量)
如果您无法计算这一点,您还可以尝试设置轨迹可以达到的最大长度,这样当它达到该长度时,它就开始覆盖旧值。如果摄像机跟随球移动,这应该没什么影响。如果这些解决方案都不满足您的需求,请继续使用 ToArray 函数。