Нулевое исключение ссылки в XNA - PullRequest
2 голосов
/ 15 января 2012

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

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

1 Ответ

2 голосов
/ 15 января 2012

Вы создаете новый экземпляр вашего класса 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;
    }
...