C# XNA,如何绘制所有可绘制的游戏对象?

C# XNA,如何绘制所有可绘制的游戏对象?,c#,xna,C#,Xna,我记得不久前看到了一些绘制和更新所有drawablegameobjects的方法。我认为这是一个foreach循环,比如 foreach(DrawableGameComponent dgc in Game.Components) 有人能告诉我做这件事的正确方法吗?或者他们是否知道这方面的教程 谢谢 您是正确的,您可以简单地在Components数组中的每个项上循环,并调用它的draw方法,但是有一些事情需要考虑,下面的代码应该适合您 如果这对你来说不重要,你可能不需要用提款单,而且

我记得不久前看到了一些绘制和更新所有drawablegameobjects的方法。我认为这是一个foreach循环,比如

      foreach(DrawableGameComponent dgc in Game.Components)
有人能告诉我做这件事的正确方法吗?或者他们是否知道这方面的教程


谢谢

您是正确的,您可以简单地在Components数组中的每个项上循环,并调用它的draw方法,但是有一些事情需要考虑,下面的代码应该适合您

如果这对你来说不重要,你可能不需要用提款单,而且你可能不应该用linq,因为它非常慢,但现在你可以开始了

foreach (var component in Components.OrderBy(x => ((IDrawable)x).DrawOrder))
  if (component is IDrawable)
  {
     IDrawable drawableComponent = (IDrawable)component;
     if (drawableComponent.Visible)
        drawableComponent.Draw(gameTime);
  }

您可以这样做:

foreach(var dgc in Game.Components.OfType<DrawableGameComponent>()
                                  .OrderBy(x => x.DrawOrder))
{

}
foreach(Game.Components.OfType()中的var dgc)
.OrderBy(x=>x.DrawOrder))
{
}

由于对象可能会扩展DrawableGameObject,因此您始终可以将其添加到游戏组件中:

class MyGame: Game
{
     //...Your code
     override public Load()
     {
           //... YOURCODE  
           Components.Add(myDrawableObj);
     }
 }

您会注意到,只要您有base.Update();&base.Draw();在游戏的I更新和绘制方法中,所有游戏组件都将自动更新和绘制。如果在组件中添加了非视觉游戏组件,则此代码将崩溃。常规的
GameComponent
IGameComponent
不能强制转换到
IDrawable
界面以查询抽签顺序。你必须先检查一下类型。实际上,在我看来,这是最好的答案。我将向Linq查询添加一个
.Where(x=>x.Visible)