在我的 2D XNA 游戏中绘制精灵的有效方法是什么?更具体地说,我将这个问题分为 4 个问题。
我曾经将 Game1 的 spriteBatch 声明为static,SpriteBatch.Begin
并.Close
在每个IDrawable.Draw
. 那效果不好。为每个可绘制对象提供自己的 SpriteBatch 也效果不佳。
Q1:我认为最好有一个SpriteBatch 实例,并且只调用一次begin/close 。它是否正确?
目前,我Game1.Draw
看起来像这样:
spriteBatch.Begin();
base.Draw(gameTime); // draws elements of Game.Components
// ...
spriteBatch.End();
Q2:这种方式,Begin
只调用一次。这是要走的路吗?你们是怎么解决这个问题的?
Q3:另外,每个组件都有自己的IGameComponent.LoadContent
方法。我应该在那里加载我的内容吗?还是在父类中加载内容更好,例如Game1.LoadContent
?
我意识到我不应该两次加载相同的内容,所以我给了我的可绘制组件一个 static 和一个 non-static Texture2D
,并给了它们 2 个构造函数:
static Texture2D defaultTexture;
public Texture2D MyTexture;
public Enemy()
: this(defaultTexture) { }
public Enemy(Texture2D texture)
{
MyTexture = texture;
}
protected override void LoadContent()
{
if (MyTexture == null)
{
if (defaultTexture == null)
{
defaultTexture = Content.Load<Texture2D>("enemy");
}
MyTexture = defaultTexture;
}
}
这样,类的默认纹理仅在该类第一次LoadContent
调用时加载。但是,当texture
在构造函数中指定参数时,我必须事先加载该纹理。
Q4:我认为应该有更好的方法来做到这一点。我正在考虑创建一个纹理字典,其资产名称为字符串。你有什么建议?