我不明白我在这里做错了什么:
public void Draw(GameTime gameTime) // in ScreenManager
{
SpriteBatch.Begin(SpriteBlendMode.AlphaBlend);
for (int i = 0; i < Screens.Count; i++)
{
if (Screens[i].State == Screen.ScreenState.HIDDEN)
continue;
Screens[i].Draw(gameTime);
}
SpriteBatch.End(); // null ref exception
}
SpriteBatch本身不为空。
更多背景信息:
public class MasterEngine : Microsoft.Xna.Framework.Game
{
public MasterEngine()
{
graphicsDeviceManager = new GraphicsDeviceManager(this);
Components.Add(new GamerServicesComponent(this));
// ...
spriteBatch = new SpriteBatch(graphicsDeviceManager.GraphicsDevice);
screenManager = new ScreenManager(assets, gameEngine, graphicsDeviceManager.GraphicsDevice, spriteBatch);
}
//...
protected override void Draw(GameTime gameTime)
{
screenManager.Draw(gameTime); // calls the problematic method
base.Draw(gameTime);
}
}
我未能正确初始化某些内容吗?
更新
作为一项实验,我尝试使用MasterEngine
的构造函数:
spriteBatch = new SpriteBatch(graphicsDeviceManager.GraphicsDevice);
spriteBatch.Begin();
spriteBatch.DrawString(assets.GetAsset<SpriteFont>("calibri"), "ftw", new Vector2(), Color.White);
spriteBatch.End();
这不会导致NRE。嗯...
更新2:这确实会导致NRE:
protected override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
spriteBatch.End(); // boned here
//screenManager.Draw(gameTime);
base.Draw(gameTime);
}
答案 0 :(得分:2)
您不应该在游戏类的构造函数或SpriteBatch
类中创建DrawableGameComponent
,因为不能保证此时GraphicsDevice
已正确初始化。 (事实上,您最终可能会使用空图形设备初始化它们:P)
将您的SpriteBatch
创建移动到被覆盖的LoadContent
方法
与您的ScreenManager
相同,您在错误的位置传递GraphicsDevice
。如果您的ScreenManager
继承自DrawableGameComponent
,那么无论如何您都应该可以访问其中的GraphicsDevice
属性,您可以在屏幕的LoadContent
方法中使用该属性来管理加载ScreenManager
所需的任何内容。
希望有所帮助。
答案 1 :(得分:0)
我很长时间没有使用XNA,但SpriteBatch不应该是小写的(或者有其他名称),否则你将引用实际的SpriteBatch类而不是实例?