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);
}
}
}
}
}
}
我正在尝试在Xna中创建一个简单的自上而下的平铺游戏,但每当我运行该程序时,我都会收到此错误:
Microsoft.Xna.Framework.Graphics.dll中出现未处理的“System.ArgumentNullException”类型异常
其他信息:此方法不接受此参数的null。
通过一些反复试验我发现导致异常的是这段代码:tile [tileID]在行中: spriteBatch.Draw(tiles [tileID],tilePos,Color.White); 但我无法弄清楚该怎么做。我检查了An unhandled exception of type 'System.ArgumentNullException' occurred in MonoGame.Framework.dll,但它没有帮助我,因为tiles []和tileID都被初始化了。对此问题的任何帮助将不胜感激,谢谢。 :P
我的代码:
答案 0 :(得分:0)
你正在调用一个没有Null作为参数的方法,如果你没有行号,那行的方法我们真的不知道哪个方法可能导致异常
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(device));
看起来它可能是由这个方法引起的,你可以在那里放一个断点并检查值并在这里发布定义吗?
答案 1 :(得分:0)
这是因为当您创建createMap
对象map
时,纹理(草,石头,泥土)为空,因此它使用null填充地图对象中的数组tiles
项目。稍后,当你去绘制它们时,第一个参数(texture2d)不允许为空,因此它会抛出错误。
如果您尝试运行代码,它会在spriteBatch.Draw
行停止并将其变为黄色。将鼠标光标悬停在tiles[tileID]
上方,然后单击+号。你会在那里看到3个空纹理。
但如果相反,你只需简单地声明map
而不试图&#34; new&#34;它,然后&#34;在LoadContent()
方法加载纹理后新建它,它会正常工作。
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
}
这样就可以快速轻松地解决您的问题。但是,在没有构造函数的情况下加载包含大量静态对象和类的项目通常会在一段时间后迅速导致难以管理的代码库。