简体   繁体   中英

NullReferenceException in XNA with C#

I am trying to make a simple 3D game for windows with XNA and C#. I was trying to create view Matrices, as is suggested by every tutorial, and even MSDN, but I am getting a NullReferenceException error.

The error reads: Object Reference not set to an instance of an Object. It points to the definition of the projection matrix:

projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 300.0f);

Here is my Code:

using System;
using System.Collections.Generic;
using System.Linq;
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 Series3D1
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        Effect effect;

        VertexPositionColor[] vertices;

        Matrix viewMatrix;
        Matrix projectionMatrix;

        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        GraphicsDevice device;

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

        protected override void Initialize()
        {
            graphics.PreferredBackBufferWidth = 500;
            graphics.PreferredBackBufferHeight = 500;
            graphics.IsFullScreen = false;
            graphics.ApplyChanges();

            Window.Title = "Riemer's XNA Tutorials -- Series 1";

            base.Initialize();
        }

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

            SetUpCamera();

            effect = Content.Load<Effect>("effects");

            SetUpVerticies();

            device = graphics.GraphicsDevice;
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            base.Update(gameTime);
        }

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

            effect.CurrentTechnique = effect.Techniques["ColoredNoShading"];

            effect.Parameters["xView"].SetValue(viewMatrix);
            effect.Parameters["xProjection"].SetValue(projectionMatrix);
            effect.Parameters["xWorld"].SetValue(Matrix.Identity);

            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                pass.Apply();
            }

            device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1, VertexPositionColor.VertexDeclaration);

            base.Draw(gameTime);
        }

        private void SetUpVerticies()
        {
            vertices = new VertexPositionColor[3];

            vertices[0].Position = new Vector3(0f, 0f, 0f);
            vertices[0].Color = Color.Red;
            vertices[1].Position = new Vector3(10f, 10f, 0f);
            vertices[1].Color = Color.Green;
            vertices[2].Position = new Vector3(10f, 0f, -5f);
            vertices[2].Color = Color.Yellow;
        }

        private void SetUpCamera()
        {
            viewMatrix = Matrix.CreateLookAt(new Vector3(0, 0, 50), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
            projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 300.0f);
        }
    }
}

You need to set your device = graphics.GraphicsDevice before calling SetUpCamera() . The SetUpCamera method requires that the device field has already been assigned, which it hasn't in the current order you have.

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

    SetUpCamera();

    effect = Content.Load<Effect>("effects");

    SetUpVerticies();

    device = graphics.GraphicsDevice;
}

has to be

protected override void LoadContent()
{
    device = graphics.GraphicsDevice;

    spriteBatch = new SpriteBatch(GraphicsDevice);

    SetUpCamera();

    effect = Content.Load<Effect>("effects");

    SetUpVerticies();
}

Such that device is set (which is required by SetUpCamera and SetUpVerticies ).

Debugging tip: Check out the locals to verify your assumptions, you would see device is null . You can also do this by hovering the variables in your line...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM