【问题标题】:An unhandled exception of type 'System.ArgumentNullException' occurred in Microsoft.Xna.Framework.Graphics.dllMicrosoft.Xna.Framework.Graphics.dll 中出现“System.ArgumentNullException”类型的未处理异常
【发布时间】:2015-08-14 14:28:52
【问题描述】:

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。

通过一些试验和错误,我发现正是这段代码导致了异常:tiles[tileID] 在该行: spriteBatch.Draw (tiles[tileID], tilePos, Color.White);, 但我不知道该怎么做。我检查了An unhandled exception of type 'System.ArgumentNullException' occurred in MonoGame.Framework.dll,但它并没有帮助我,因为瓷砖 [] 和 tileID 都已初始化。任何有关此问题的帮助将不胜感激,谢谢。 :P

我的代码:

【问题讨论】:

  • 我还是没能把sn-ps放在文字下面:(

标签: c# xna


【解决方案1】:

这是因为当您创建 createMap 对象 map 时,纹理(草、石、泥土)为空,因此它在地图对象中使用空项目填充数组 tiles。后来,当你去绘制它们时,第一个参数(texture2d)不允许为空,所以它会抛出错误。

如果您尝试运行代码,它会停在spriteBatch.Draw 行并变成黄色。将鼠标光标悬停在tiles[tileID] 上并在其下方单击+ 号。您将在那里看到 3 个空纹理。

但是,如果您只是简单地声明 map 而不尝试“新建”它,然后“在 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

}

所以这将是解决您当前问题的快速简便的方法。但是,在没有构造函数的情况下加载包含大量静态对象和类的项目通常会在一段时间后很快导致难以管理的代码库。

【讨论】:

  • 谢谢,这真的很有帮助! :)
【解决方案2】:

您调用的方法不是 Null 作为参数,如果您没有行号并且该行的方法我们真的不知道哪个方法可能导致异常

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

看起来可能是这个方法引起的,能不能在这里下个断点,检查一下值,然后把定义放在这里?

【讨论】:

  • 我对编码还很陌生,我真的不知道您所说的值(什么?)和定义(什么?)是什么意思。你能解释一下你想要什么吗?对不起,我相信我会在一年后看到这条评论,然后尴尬地死去......
  • @Baconinvader 可能你在制作游戏之前学习了调试的基础知识。
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2020-07-22
  • 2021-01-14
  • 2014-06-03
  • 2011-10-18
相关资源
最近更新 更多