spriteBatch是Null

时间:2013-07-27 21:59:51

标签: c# xna null initialization spritebatch

我正在创建一个游戏,目前我有3个课程,greenpaddle,ball和Game1。

当我运行游戏时,调试器会跳到我的spriteBatch.Begin(); 并说 NullReferenceException未处理。 这是我的Game1.cs:

public class Game1 : Microsoft.Xna.Framework.Game
{

    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Ball ball;
    GreenPaddle gPaddle;
    Texture2D BackGround;


    public Game1()
    {

        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        graphics.PreferredBackBufferHeight = 500;
    }

    protected override void Initialize()
    {
        gPaddle = new GreenPaddle();
        ball = new Ball(gPaddle);
    }

    /// <summary>
    /// LoadContent will be called once per game and is the place to load
    /// all of your content.
    /// </summary>
    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = new SpriteBatch(GraphicsDevice);

        BackGround = Content.Load<Texture2D>("pongBG");
        gPaddle.LoadContent(Content);
        ball.LoadContent(Content);
    }

    /// <summary>
    /// UnloadContent will be called once per game and is the place to unload
    /// all content.
    /// </summary>
    protected override void UnloadContent()
    {
        // TODO: Unload any non ContentManager content here
    }

    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        gPaddle.Update(gameTime);//Error Line
        ball.Update(gameTime);

        base.Update(gameTime);
    }

    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();//Error Line
        spriteBatch.Draw(BackGround, new Vector2(0f, 0f), Color.White);
        gPaddle.Draw(spriteBatch);
        ball.Draw(spriteBatch);
        spriteBatch.End();
        base.Draw(gameTime);
    }
}

不知道出了什么问题,这从未发生在我身上。

1 个答案:

答案 0 :(得分:1)

因为你初始化了spritebatch ......

spriteBatch = new SpriteBatch(GraphicsDevice);

......除非您的其他课程正在更改,否则不应该是null

您可以尝试的事情:

- 在加载内容中设置断点,我不知道为什么不会调用它,只是检查一下,确保调用LoadContent()

- 重建项目并确保保存更改。


...当我写这个答案并在我的机器上测试代码时,我终于找到了错误。我会留下上面的建议,以防其他人有这些问题之一。

您未在base.Initialize方法中致电Initialize()。此方法调用内部XNA内容,这会导致LoadContent()被调用。

base.LoadContent方法中调用LoadContent()也是一个好主意,您应该始终在任何重写方法上调用基本方法。