很多时候我发现自己想知道在XNA中只使用一个spritebatch是一种简单的方法,发现microsoft的内置组件系统是一个好主意,而是隐藏构建。
我只能假设XNA的很多方式是由于向后兼容性或Xbox兼容性,这本身并不是坏事,而且我确信有些细节需要开发才能实现。它们的方式,但主要系统看起来有点神秘。
答案 0 :(得分:0)
答案 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