我正在阅读 XNA 4.0游戏开发示例:初学者指南这本书,我不断收到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();
}
}
}
答案 0 :(得分:0)
通过查看您的代码,您似乎还没有初始化“游戏”对象。我知道Game类对象是在你的主类和程序的起点中定义的,但似乎你没有在MapEditor类中传递对它的引用。
这里,程序认为你已经定义了一个新的Game对象,但是还没有初始化它。这就是为什么它会吐出一个Null Reference Exception。您需要在此类中引用原始游戏对象,方法是传递它,或者通过使用全局变量。
答案 1 :(得分:0)
在MapEditor
构造函数中,您需要初始化Game1
对象,但我建议您使用Game
代替Game1
,因为Game1
是运行游戏的主要类,不应该以这种方式使用它。
尝试这样的事情:
public Game game;
public MapEditor(Game game)
{
this.game = game;
InitializeComponent();
}