2012-01-15 3 views
2

У меня проблема с XNA. Я пытаюсь заставить текст «дышать», расширяя и сокращаясь, но он не будет работать корректно. Он компилируется отлично, но я продолжаю получать ссылку «NullReferenceException: Object», не установленную на экземпляр объекта ». после запуска. У меня есть два файла: Game1.cs и BreathingText.cs.Исключение нулевой ссылки в XNA

BreathingText.cs:

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Audio; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.GamerServices; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Media; 

namespace TestingThings 
{ 
    class BreathingText 
    {  
     public void drawText(string textToDraw, int X, int Y) 
     { 
      int fontRestraint = 1; 
      Game1 game = new Game1(); 
      GraphicsDeviceManager graphics = game.graphics; 
      SpriteBatch sB = game.spriteBatch; 
      SpriteFont font = game.gameFont; 
      Vector2 FontPos = new Vector2(X, Y); 
      Vector2 StrCenter = new Vector2(0,0); //font.MeasureString(textToDraw)/2; 

      sB.Begin(); 
      sB.DrawString(font, 
          textToDraw, 
          FontPos, 
          Color.LightGreen, 
          0, 
          StrCenter, 
          1.0f, 
          SpriteEffects.None, 
          0.5f); 
      if (fontRestraint == 1) 
      { 
       font.Spacing += 0.25F; 
      } 
      else if (fontRestraint == 0) 
      { 
       font.Spacing -= 0.25F; 
      } 
       if (font.Spacing == 17) 
       { 
        fontRestraint = 0; 
       } 
       else if (font.Spacing == 0) 
       { 
        fontRestraint = 1; 
       } 
      sB.End(); 
     } 
    } 
} 

Исключение происходит в sB.Begin(). Я думал, что это происходит потому, что spriteBatch в Game1.cs не инициализировался, но мне это нравится. Вот Game1.cs:

namespace TestingThings 
{ 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     public GraphicsDeviceManager graphics; 
     public SpriteBatch spriteBatch; 
     public SpriteFont gameFont; 

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

     protected override void Initialize() 
     { 
      base.Initialize(); 
     } 

     protected override void LoadContent() 
     { 
      spriteBatch = new SpriteBatch(GraphicsDevice); 
      gameFont = Content.Load<SpriteFont>("Celestia"); 
     } 

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

      base.Update(gameTime); 
     } 

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

      BreathingText breath = new BreathingText(); 
      breath.drawText("test", graphics.GraphicsDevice.Viewport.Width/2, graphics.GraphicsDevice.Viewport.Height - 25); 
      base.Draw(gameTime); 
     } 
    } 
} 

Я не уверен, почему он не работает, потому что кажется, что он должен. Тем не менее, я новичок, и решение, скорее всего, прямо под моим носом. У меня был код BreathingText.cs в методе Draw в Game1, и он работал нормально, пока я не переместил его в свой класс.

Любая помощь будет оценена по достоинству.

Спасибо, MrAnthology

+3

Является ли случайным исключением исключение в вашем коде или код XNA? –

+0

Это происходит на 'sB.Begin()' в моем собственном BreathingText.cs, поэтому я предполагаю, что это мое собственное дело. Как я уже сказал, я новичок в C#, поэтому я все еще учась отлаживать такие вещи. – MrAnthology

+0

Я не использую XNA, но похоже, что 'Game1.LoadContent' не вызывается в конструкторе базового класса. Когда это следует назвать? – Groo

ответ

2

Вы создаете новый экземпляр вашего класса game1 в методе DrawText (Game1 game = new Game1();), так SpriteBatch этой игры никогда не присваивается значение (это будет null).

Вы должны передать экземпляр вашего игрового объекта при создании своего текстового класса, а затем использовать его в методе drawtext.

class BreathingText 
{ 
    private Game1 _Game1; // Use this were you have 'game' currently 

    public BreathingText(Game1 game) 
    { 
     _Game1 = game; 
    } 
+0

Спасибо за информацию, которая отлично работала. – MrAnthology

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