XNA:什么可以导致SpriteBatch.End()抛出NRE?

时间:2010-04-03 19:53:19

标签: c# xna

我不明白我在这里做错了什么:

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);
}

2 个答案:

答案 0 :(得分:2)

您不应该在游戏类的构造函数或SpriteBatch类中创建DrawableGameComponent,因为不能保证此时GraphicsDevice已正确初始化。 (事实上​​,您最终可能会使用空图形设备初始化它们:P)

将您的SpriteBatch创建移动到被覆盖的LoadContent方法

与您的ScreenManager相同,您在错误的位置传递GraphicsDevice。如果您的ScreenManager继承自DrawableGameComponent,那么无论如何您都应该可以访问其中的GraphicsDevice属性,您可以在屏幕的LoadContent方法中使用该属性来管理加载ScreenManager所需的任何内容。

希望有所帮助。

答案 1 :(得分:0)

我很长时间没有使用XNA,但SpriteBatch不应该是小写的(或者有其他名称),否则你将引用实际的SpriteBatch类而不是实例?

相关问题