0

我正在关注XNA 4.0 Game Development By Example: A Beginner's Guide 一书,但我不断收到 Null Reference Exception 错误。特别是在game.Tick我的代码部分。只是想知道我是否编码不正确,或者 Visual Studio 是否只是表现得很奇怪。谢谢

namespace Level_Editor
{
    public partial class MapEditor : Form
    {
        public Game1 game;


        public MapEditor()
        {
            InitializeComponent();
        }

        private void LoadImageList()
        {
            string filepath = Application.StartupPath +
                @"\Content\Textures\PlatformTiles.png";
            Bitmap tileSheet = new Bitmap(filepath);
            int tilecount = 0;
            for (int y = 0; y < tileSheet.Height / TileMap.TileHeight; y++)
            {
                for (int x = 0; x < tileSheet.Width / TileMap.TileWidth; x++)
                {
                    Bitmap newBitmap = tileSheet.Clone(new
                        System.Drawing.Rectangle(
                            x * TileMap.TileWidth,
                            y * TileMap.TileHeight,
                            TileMap.TileWidth,
                            TileMap.TileHeight),
                            System.Drawing.Imaging.PixelFormat.DontCare);

                    imgListTiles.Images.Add(newBitmap);
                    string itemName = "";
                    if (tilecount == 0)
                    {
                        itemName = "Empty";
                    }
                    if (tilecount == 1)
                    {
                        itemName = "White";
                    }
                    listTiles.Items.Add(new
                        ListViewItem(itemName, tilecount++));
                }
            }

            FixScrollBarScales();
        }

        private void FixScrollBarScales()
        {
            Camera.ViewPortWidth = pctSurface.Width;
            Camera.ViewPortHeight = pctSurface.Height;

            Camera.Move(Vector2.Zero);

            vScrollBar1.Minimum = 0;
            vScrollBar1.Maximum =
                Camera.WorldRectangle.Height -
                Camera.ViewPortHeight;

            hScrollBar1.Minimum = 0;
            hScrollBar1.Maximum =
                Camera.WorldRectangle.Width -
                Camera.ViewPortWidth;
        }

        private void loadMapToolStripMenuItem_Click(
            object sender,
            EventArgs e)
        {
            try
            {
                TileMap.LoadMap(new FileStream(
                    Application.StartupPath + @"\MAP" +
                    cboMapNumber.Items[cboMapNumber.SelectedIndex] + ".MAP",
                    FileMode.Open));
            }
            catch
            {
                System.Diagnostics.Debug.Print("Unable to load map file");
            }
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
           game.Exit();
            Application.Exit();
        }

        private void MapEditor_Load(object sender, EventArgs e)
        {
            LoadImageList();

            cboCodeValues.Items.Clear();
            cboCodeValues.Items.Add("Gemstone");
            cboCodeValues.Items.Add("Enemy");
            cboCodeValues.Items.Add("Lethal");
            cboCodeValues.Items.Add("EnemyBlocking");
            cboCodeValues.Items.Add("Start");
            cboCodeValues.Items.Add("Clear");
            cboCodeValues.Items.Add("Custom");

            for (int x = 0; x < 100; x++)
            {
                cboMapNumber.Items.Add(x.ToString().PadLeft(3, '0'));
            }

            cboMapNumber.SelectedIndex = 0;

            TileMap.EditorMode = true;

            backgroundToolStripMenuItem.Checked = true;
        }

        private void timerGameUpdate_Tick(object sender, EventArgs e)
        {
            if (hScrollBar1.Maximum < 0)
            {
                FixScrollBarScales();
            }

            game.Tick();

            if (game== null && game.HoverCodeValue != lblCurrentCode.Text)
               lblCurrentCode.Text =game.HoverCodeValue;

        }

        private void MapEditor_FormClosed(
            object sender,
            FormClosedEventArgs e)
        {
           game.Exit();
            Application.Exit();
        }

    }
}
4

2 回答 2

0

在您的MapEditor构造函数中,您需要初始化您的Game1对象,但我建议您使用Game而不是Game1,因为Game1它是运行游戏的主类,您不应该以这种方式使用它。

尝试这样的事情:

public Game game;

public MapEditor(Game game)
{
    this.game = game;

    InitializeComponent();
}
于 2013-10-15T16:09:54.113 回答
0

通过查看您的代码,您似乎还没有初始化“游戏”对象。我知道在您的主类和程序的起点中定义了一个 Game 类对象,但是您似乎没有在 MapEditor 类中传递对它的引用。

在这里,程序认为您已经定义了一个新的 Game 对象,但尚未对其进行初始化。这就是为什么它吐出一个空引用异常。你需要在这个类中引用你的原始游戏对象,或者通过传递它,或者通过使用全局变量。

于 2013-10-14T21:33:33.630 回答