0
votes

Game.cs

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 Toast_Engine
{
    public class Game : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        GraphicsDevice device;
        Texture2D background;
        Texture2D player;
        public static Texture2D stone;
        public static Texture2D dirt;
        public static Texture2D grass;
        SpriteBatch spriteBatch;
        public Rectangle playerCollision;
        public Rectangle backgroundRectangle;
        createMap map = new createMap();
        Camera cam = new Camera();
        public Vector2 playerPos;
        int playerHealth = 100;
        int playerHeight = 30;
        int playerWidth = 30;
        public Game()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            base.Initialize();
         
            cam.cameraInit();
            playerPos = new Vector2(0, 0);
           
        }
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            device = graphics.GraphicsDevice;
            background = Content.Load<Texture2D>("plain");
            player = Content.Load<Texture2D>("Player_Test");
            grass = Content.Load<Texture2D>("grass");
            dirt = Content.Load<Texture2D>("dirt");
            stone = Content.Load<Texture2D>("stone");
        }
        protected override void UnloadContent()
        {
        }
        protected override void Update(GameTime gameTime)
        {
            //UPDATING CODE
            //THIS TEXT IS HERE TO MAKE THE CODE EASY TO SPOT AMONGST OTHER CODE
            //1234567890QWERTYUIOP

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            keyCheck();
            positionPlayerCollision();
            positionCamera();
            positionBackground();
            

            base.Update(gameTime);
        }
        private void positionBackground()
        {
            int screenWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
            int screenHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
            backgroundRectangle = new Rectangle(0, 0, screenWidth, screenHeight);
        }
        public void positionCamera()
        {
            cam.Pos = playerPos;
        }
        private void positionPlayerCollision()
        {
            playerCollision = new Rectangle((int)playerPos.X, (int)playerPos.Y, playerWidth, playerHeight);
        }
        private void drawPlayer()
        {
            spriteBatch.Draw(player, playerCollision, Color.White);
        }
        private void drawBackground()
        {
            spriteBatch.Draw(background, backgroundRectangle, Color.White);
        }
        public void keyCheck()
        {
            KeyboardState keysPressed = Keyboard.GetState();
            if(keysPressed.IsKeyDown(Keys.W))
            {
                playerPos.Y--;
            }
            if (keysPressed.IsKeyDown(Keys.A))
            {
                playerPos.X--;
            }
            if (keysPressed.IsKeyDown(Keys.S))
            {
                playerPos.Y++;
            }
            if (keysPressed.IsKeyDown(Keys.D))
            {
                playerPos.X++;
            }
        }
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            //DRAWING CODE
            //THIS TEXT IS HERE TO MAKE THE CODE EASY TO SPOT AMONGST OTHER CODE
            //1234567890QWERTYUIOP

            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(device));
            drawPlayer();
            map.renderMap(spriteBatch);
            drawBackground();
            //Console.WriteLine(cam.Pos);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

createMap.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Toast_Engine
{

    class createMap
    {
        
        public int amountOfTiles = 4;
        public int mapWidth = 5;
        public int mapHeight = 10;
        public int tileSize = 32;
        private Vector2 test = new Vector2(5, 5);
        public int[,] tileMap = new int[,]
        {
        {1,1,2,0,0,2,0,0,1,3},
        {3,0,0,3,3,0,0,0,3,0},
        {2,2,2,2,2,2,2,2,2,2},
        {2,1,1,1,1,1,1,1,1,2},
        {1,1,1,1,1,1,1,1,1,1}
        };
        public Texture2D[] tiles = new Texture2D[] 
        {
           Game.grass,Game.grass,Game.dirt,Game.stone
        };
        

        public void renderMap(SpriteBatch spriteBatch)
        {
            Console.WriteLine("Thing actually running");
            for (int x = 0; x < mapWidth; x++)
            {
                for (int y = 0; y < mapHeight; y++)
                {
                    Console.WriteLine("X = " + x + ", Y = " + y);
                    Vector2 tilePos = new Vector2((x+1)*tileSize, (y+1)*tileSize);
                    int tileID = tileMap[x, y];
                    if(tileID != 0)
                    {
                        Console.WriteLine("Tile ID of " + x + "," + y + " is " + tileID+" , Texture is "+tiles[tileID]);
                        spriteBatch.Draw (tiles[tileID], tilePos, Color.White);
                    }
                }
            }
        }
    }
}

I am trying to create a simple top down tile based game in Xna but whenever I run the program I get this error:

An unhandled exception of type 'System.ArgumentNullException' occurred in Microsoft.Xna.Framework.Graphics.dll

Additional information: This method does not accept null for this parameter.

Through some trial and error I found out that It was this bit of code that was causing the exception: tiles[tileID] in the line: spriteBatch.Draw (tiles[tileID], tilePos, Color.White);, but I can't figure out what to do. I checked out An unhandled exception of type 'System.ArgumentNullException' occurred in MonoGame.Framework.dll, but it hasn't helped me as both tiles[] and tileID are initialized. Any help with this problem would be greatly appreciated, thanks. :P

My code:

2
I still fail to put the snippets below the text :(Baconinvader

2 Answers

0
votes

You're calling a method which doesn't Null as a parameter, if you don't have a line number and the method at that line we don't really know which method could be causing the Exception

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(device));

It looks like it might be caused by this Method, can you put a breakpoint there and check the values and post the definition here?

0
votes

It is because when you create your createMap object, map, the textures (grass, stone, dirt) are null so it populates the array tiles in the map object with null items. Later, when you go to draw them, the 1st param (texture2d) is not allowed to be null so it throws the error.

If you try to run the code, it stops at that spriteBatch.Draw line and turns it yellow. Hover your mouse cursor over the tiles[tileID] and under it click the + sign. you will see 3 null textures there.

But if instead, you were to simply declare map without trying to "new" it, then "new it after loading the textures in the LoadContent() method, it would work fine.

class game
{

  public static Texture2d grass;

  public createMap map;


protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            device = graphics.GraphicsDevice;
            background = Content.Load<Texture2D>("plain");
            player = Content.Load<Texture2D>("Player_Test");
            grass = Content.Load<Texture2D>("grass");
            dirt = Content.Load<Texture2D>("dirt");
            stone = Content.Load<Texture2D>("stone");

//then create the map
                map = new createMap();
            }
     //rest of class

}

So that would be the quick and easy way to get past your immediate problem. However, loading up a project with lots of static objects and classes without constructors usually leads quickly to hard-to-manage code base after a while.