构建XNA游戏引擎:如何在LoadContent()之外加载精灵?

我想在XNA中构建一个引擎,主要用于2D RPG。 起初,我开始抽象出一些类,并构建了一个包装了Vector2Texture2D的Sprite类,并尝试从Sprite类的构造函数中加载内容。 但是,这不起作用。 现在看来,我必须加载Game类的LoadContent方法中的所有精灵。 有没有办法解决? 如果可能的话,我想将实际的游戏内容与引擎的内部工作分开。

LoadContent方法仅在graphics设备初始化后调用。 您可以在任何时候加载内容,而不仅仅是在LoadContent方法中。

例如,如果您是在LoadContent方法内或在Draw或Update调用中实例化Sprite类,则不会有任何问题。

现在,就devise而言,让精灵加载它所需要的内容通常不是一个好主意。 为了保持单一职责原则和依赖倒置原则,你可能想接受一个Texture2D作为Sprite构造函数的参数。 这样你就可以拥有同样的“BadGuy”精灵,但是能够传递两种不同的纹理(比如红色的坏人和绿色的坏人)。

你不需要在LoadContent方法中加载所有的内容,你可以在它所调用的方法中加载它,或者在之后的几乎任何时候加载它(一旦GraphicsDevice被设置)。

一个非常简单的例子可能是在你的游戏引擎中有一个列表或类似的结构,然后在加载引擎的用户之前会添加要加载的内容的位置和types。 然后,从游戏的LoadContent方法中调用引擎的LoadContent方法。 然后引擎将循环添加资源并加载它们以用于引擎。

这当然是一个简单的例子,你可能需要某种资源管理器来管理加载/卸载/使资源可用于需要的东西等等。

早在我使用XNA的时候,我需要在运行时加载纹理。

我花了1个小时试图find它,它使用stream从磁盘读取文件,然后加载到一个纹理2D,然后你可以传递给你的精灵或做你需要的东西。

  Dim Texture As Texture2D Using FS As New FileStream(imagepath, FileMode.Open, FileAccess.Read) FS.Seek(0, SeekOrigin.Begin) Texture = Texture2D.FromStream(GraphicsDevice, FS) FS.Close() End Using 

希望帮助或接近你所需要的。

如果你有这个构造函数呢? (我的意思是,这可能吗?)

 Sprite(Microsoft.Xna.Framework.Content.ContentManager content){ Texture2D something = content.Load<Texture2D>("someImages"); }