1

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);
        }
    }
}
3
  • Have you checked if device.Viewport or device.Viewport.AspectRatio are nulls? Commented May 12, 2012 at 3:25
  • Check the bottom of my answer for debugging tips that will make it easier to solve these kinds of errors. Commented May 12, 2012 at 3:30
  • Please promise me you'll learn how to do basic debugging Commented May 12, 2012 at 3:51

2 Answers 2

5

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.

Sign up to request clarification or add additional context in comments.

Comments

2
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...

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.