2010-04-11 3 views
0

«Ссылка на объект не установлена ​​в экземпляр объекта».Исключение нулевой ссылки

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

Thats остальной части кода

+4

И где это происходит? – Femaref

+0

И мы понятия не имеем, где ошибка. –

+0

Нулевая ссылка происходит, когда вы используете переменную, которая не инициализирована. Таким образом, эта ошибка должна быть внутри метода loadcontent или draw. –

ответ

1

Я просмотрел его и сумел заставить его работать с использованием проверки, если спрайт, который вы рисуете, имеет нулевую ссылку (без текстуры), он проигнорирует его и продолжит рисовать все остальное.

Измените свой метод Draw() в Sprite.cs к этому:

//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, просто присвоить ему текстуру, как у вас с остальными спрайтов, и он будет работать нормально.

Вам не нужно удалять if(mSpriteTexture != null) из метода Draw() после того, как вы назначили текстуру, хотя, если вы этого не сделаете, это означает, что вы не заметите, что что-то не назначено правильно, боль, если вы отлаживаете что-то еще позже.

+0

Первый, который я опубликовал, это ошибка, а вторая - код, в котором используется класс. – Alex

+0

Я переустанавливаю XNA 3.1 сейчас, и я дам ему –

+0

Im using XNA 3.0 – Alex

0

Вероятно, вы должны проверить

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

И в функции Draw тоже.

7
  1. Посмотрите, как установить Visual Studio на исключения.
  2. Узнайте, как использовать отладчик, чтобы вы могли просмотреть свой код, чтобы узнать, где происходит ошибка.
0

Эта ошибка означает, что одно из полей или методов объекта было запрошено для доступа без экземпляра объекта.

Для вас код кажется, что это происходит с объектом mSpriteTexture.

Вы должны добавить

mSpriteTexture = new Texture2D(); 

где-то, но я не могу сказать, где только этот кусок кода.

Смежные вопросы