空参考例外

时间:2010-04-11 16:33:39

标签: c# xna 2d sprite nullreferenceexception

“对象引用未设置为对象的实例。”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace XNAdev
{
    class Sprite
    {
        //The size of the Sprite
        public Rectangle Size;

        //Used to size the Sprite up or down from the original image
        public float Scale = 1.0f;

        //The current position of the Sprite
        public Vector2 Position = new Vector2(115, 0);
        //The texture object used when drawing the sprite
        private Texture2D mSpriteTexture;

        //Load the texture for the sprite using the Content Pipeline
        public void LoadContent(ContentManager theContentManager, string theAssetName)
        {
            mSpriteTexture = theContentManager.Load<Texture2D>(theAssetName);
            Size = new Rectangle(0, 0, (int)(mSpriteTexture.Width * Scale), (int)(mSpriteTexture.Height * Scale));
        }

        //Draw the sprite to the screen
        public void Draw(SpriteBatch theSpriteBatch)
        {
            theSpriteBatch.Draw(mSpriteTexture, Position,
                new Rectangle(0, 0, mSpriteTexture.Width, mSpriteTexture.Height), Color.White,
                0.0f, Vector2.Zero, Scale, SpriteEffects.None, 0);

        }    
    }
}

我对这个C#很新,所以任何帮助都会很棒。

我不知道我的错误是什么。


namespace XNAdev
{

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Sprite mSprite;
        Sprite mSpriteTwo;
        Sprite mBackgroundOne;
        Sprite mBackgroundTwo;
        Sprite mBackgroundThree;
        Sprite mBackgroundFour;
        Sprite mBackgroundFive;





        public Game1()
        {           

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

        protected override void Initialize()
        {
            mSprite = new Sprite();
            mSpriteTwo = new Sprite();

            mBackgroundOne = new Sprite();
            mBackgroundOne.Scale = 2.0f;

            mBackgroundTwo = new Sprite();
            mBackgroundTwo.Scale = 2.0f;

            mBackgroundThree = new Sprite();
            mBackgroundThree.Scale = 2.0f;

            mBackgroundFour = new Sprite();
            mBackgroundFour.Scale = 2.0f;

            mBackgroundFive = new Sprite();
            mBackgroundFive.Scale = 2.0f;

            base.Initialize();
        }

        protected override void LoadContent()
        { 
            spriteBatch = new SpriteBatch(GraphicsDevice);

            mSprite.Position = new Vector2(125, 245);

            mSpriteTwo.LoadContent(this.Content, "SquareGuy");
            mSpriteTwo.Position.X = 300;
            mSpriteTwo.Position.Y = 300;

            mBackgroundOne.LoadContent(this.Content, "Background01");
            mBackgroundOne.Position = new Vector2(0, 0);            

            mBackgroundTwo.LoadContent(this.Content, "Background02");
            mBackgroundTwo.Position = new Vector2(mBackgroundOne.Position.X + mBackgroundOne.Size.Width, 0);

            mBackgroundThree.LoadContent(this.Content, "Background03");
            mBackgroundThree.Position = new Vector2(mBackgroundTwo.Position.X + mBackgroundTwo.Size.Width, 0);

            mBackgroundFour.LoadContent(this.Content, "Background04");
            mBackgroundFour.Position = new Vector2(mBackgroundThree.Position.X + mBackgroundThree.Size.Width, 0);

            mBackgroundFive.LoadContent(this.Content, "Background05");
            mBackgroundFive.Position = new Vector2(mBackgroundFour.Position.X + mBackgroundFour.Size.Width, 0);            
        }

        protected override void UnloadContent()
        {

        }


        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            if (mBackgroundOne.Position.X < -mBackgroundOne.Size.Width)
            {
                mBackgroundOne.Position.X = mBackgroundFive.Position.X + mBackgroundFive.Size.Width;
            }

            if (mBackgroundTwo.Position.X < -mBackgroundTwo.Size.Width)
            {
                mBackgroundTwo.Position.X = mBackgroundOne.Position.X + mBackgroundOne.Size.Width;
            }

            if (mBackgroundThree.Position.X < -mBackgroundThree.Size.Width)
            {
                mBackgroundThree.Position.X = mBackgroundTwo.Position.X + mBackgroundTwo.Size.Width;
            }

            if (mBackgroundFour.Position.X < -mBackgroundFour.Size.Width)
            {
                mBackgroundFour.Position.X = mBackgroundThree.Position.X + mBackgroundThree.Size.Width;
            }

            if (mBackgroundFive.Position.X < -mBackgroundFive.Size.Width)
            {
                mBackgroundFive.Position.X = mBackgroundFour.Position.X + mBackgroundFour.Size.Width;
            }

            Vector2 aDirection = new Vector2(-1, 0);
            Vector2 aSpeed = new Vector2(160, 0);

            mBackgroundOne.Position += aDirection * aSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
            mBackgroundTwo.Position += aDirection * aSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
            mBackgroundThree.Position += aDirection * aSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
            mBackgroundFour.Position += aDirection * aSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;            
            mBackgroundFive.Position += aDirection * aSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;            
        }

        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);          

            spriteBatch.Begin();

            mBackgroundOne.Draw(this.spriteBatch);
            mBackgroundTwo.Draw(this.spriteBatch);
            mBackgroundThree.Draw(this.spriteBatch);
            mBackgroundFour.Draw(this.spriteBatch);
            mBackgroundFive.Draw(this.spriteBatch);

            mSprite.Draw(this.spriteBatch);
            mSpriteTwo.Draw(this.spriteBatch);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

其余的代码

4 个答案:

答案 0 :(得分:7)

  1. 查找如何设置Visual Studio以中断异常。
  2. 了解如何使用调试器,以便您可以单步执行代码以查看错误发生的位置。

答案 1 :(得分:1)

我已经浏览了它并设法使用验证工作,如果您正在绘制的精灵有一个空引用(无纹理),它将忽略它并继续绘制其他所有内容。

将Sprite.cs中的Draw()方法更改为:

//Draw the sprite to the screen
public void Draw(SpriteBatch theSpriteBatch)
{
    if (mSpriteTexture != null)
    {
        theSpriteBatch.Draw(mSpriteTexture, Position,
            new Rectangle(0, 0, mSpriteTexture.Width, mSpriteTexture.Height), Color.White,
            0.0f, Vector2.Zero, Scale, SpriteEffects.None, 0);
    }
}

出现问题的原因是你永远不会给“ Sprite mSprite; ”一个纹理,只有一个位置。

快速摘要:

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);

    mSprite.Position = new Vector2(125, 245);

    mSpriteTwo.LoadContent(this.Content, "SquareGuy");
    mSpriteTwo.Position.X = 300;
    mSpriteTwo.Position.Y = 300;

正如你所看到的那样,你只给mSprite一个125,245的位置,只需为它分配一个与其他精灵一样的纹理,它就可以正常工作。

在分配纹理后,您不需要从Draw()方法中删除if(mSpriteTexture != null),如果不这样做,则只是意味着您不会注意到某些内容未正确分配如果你以后再调试其他东西,可能会很痛苦。

答案 2 :(得分:0)

可能你应该检查

 mSpriteTexture = theContentManager.Load<Texture2D>(theAssetName);
 if (mSpriteTexture != null)
     Size = new Rectangle(0, 0, (int)(mSpriteTexture.Width * Scale), (int)(mSpriteTexture.Height * Scale));

也在Draw功能中。

答案 3 :(得分:0)

此错误表示在没有实例化对象的情况下尝试访问对象的某个字段或方法。

对于你来说,代码似乎发生在对象mSpriteTexture上。

你应该添加

mSpriteTexture = new Texture2D();

某个地方,但我不知道只有这段代码在哪里。