XNA:只使用一个spritebatch的简单方法?

时间:2013-06-14 04:54:20

标签: c# xna xna-4.0

很多时候我发现自己想知道在XNA中只使用一个spritebatch是一种简单的方法,发现microsoft的内置组件系统是一个好主意,而是隐藏构建。

我只能假设XNA的很多方式是由于向后兼容性或Xbox兼容性,这本身并不是坏事,而且我确信有些细节需要开发才能实现。它们的方式,但主要系统看起来有点神秘。

2 个答案:

答案 0 :(得分:0)

  1. 创建自己的基类,替换DrawableGameComponent(以及相关的基础架构 - 基本上有List<MyComponentBaseType>)。
  2. 修改该基类的Draw方法以获取SpriteBatch参数。
  3. 利润。
  4. 请参阅讨论hereherehere,详细说明为什么这是一个好主意(以及GameComponentIServiceProvider 真的 for。)

答案 1 :(得分:-1)

这就是我一直以为的,直到我意识到游戏“服务”的真正目的和能力,以及它们与装箱/拆箱和.Net类型系统的链接。

我承认微软的一个错误就是缺乏创意命名。起初我一直认为游戏服务与系统服务相关联,或者服务是某种特殊的类或接口。

事实上,游戏的服务集合只不过是一组对象。服务允许的是任何已连接到游戏的游戏组件从游戏中检索数据。

这方面的一个例子是SpriteBatch。通过向游戏服务添加SpriteBatch并使用typeof(SpriteBatch)注册它,任何组件都可以通过将typeof(SpriteBatch)提供给GetService方法从服务中提取SpriteBatch。

下面是一些示例代码(未经测试,只是一个示例):

public namespace MyGame
{
  public class MainGame:Game
  {
    SpriteBatch spriteBatch;
    protected override void Initialize()
    {
      spriteBatch = new SpriteBatch(GraphicsDevice);
      Services.AddService(typeof(SpriteBatch), spriteBatch);
      base.Initialize();
    }
  }
  public class DrawableComponent : DrawableGameComponent
  {
    SpriteBatch spriteBatch;
    public override void Initialize()
    {
      spriteBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));
      if(spriteBatch == null)
      { throw new Exception("No SpriteBatch found in services"); }
    }
  }
}

我的例子也证明了一个非常被忽视的因素。 微软的默认游戏模板将SpriteBatch创建放在加载内容方法中,导致许多人相信必须保留在那里。事实上,你可以自由地向前移动它,直到初始化方法(但不是构造函数),这意味着它可以在任何组件初始化之前转移到服务中,从而确保所有从中寻找SpriteBatch的组件初始化方法中的服务将获得一个。

请务必注意,如果给定项为null,则添加到服务时将抛出异常,但是它们将不会,它将返回null并继续执行,因此必须尽快执行null检查。另请注意,如果组件是在游戏中创建的,则不会调用其初始化,因此必须通过某种方式对其进行补偿。

此技术的更多示例可在此处找到:http://itspaulsblog.blogspot.co.uk/2011/02/xna-common-sprite-batch-as-game-service.html