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: