Monogame - 关卡之间的加载问题
Monogame - Issue with Loading between levels
因为我目前正在制作一款 2D 游戏,所以我试图让我的角色能够在关卡之间加载,但我遇到了一些问题。我的播放器开始的第一个级别被加载到一个数组中,在 Game1
class 中完全没有问题,如下所示:
secondLevel secondLev; // instance for secondLevel class
Map map; // instance for Map class
secondLev = new secondLevel(); // used in the Initialize() function
protected override void LoadContent()
{
map.Generate(new int[,] {
// 0 = no tile drawn
// 3 = tile is drawn
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
}, 57); // size
}
所以为了能够加载第二个级别,我尝试创建一个名为 secondLevel
的新 class 来保存新的级别数组,并简单地将数组加载到其 Load()
函数,像这样:
class secondLevel
{
Map map;
public void Initialize()
{
map = new Map();
}
public void Load()
{
map.Generate(new int[,] {
// 0 = no tile drawn
// 3 = tile is drawn
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
}, 57); // size
}
}
现在在我的 Game1
class 中,我放置了一个 if statement
来检查玩家是否与加载下一关卡的尖峰发生碰撞,如下所示:
if (player.Bounds.Intersects(spike1.Bounds)) // if player intersects with spike
{
secondLev.Load();
}
但是当我的播放器与尖峰相交时,我的游戏冻结并且我收到错误消息:Object reference not set to an instance of an object
。
我的问题是什么?
如果我的问题中遗漏了任何可以帮助您解决此问题的附加代码,请告诉我!
由于缺乏上下文,很难说出究竟是什么原因造成的。但是,如果在您提供的代码 中发生异常,则可能未初始化以下代码之一:secondLev
或 secondLev.map
.
if (player.Bounds.Intersects(spike1.Bounds)) // if player intersects with spike
{
secondLev = new secondLevel();
secondLev.Initialize();
secondLev.Load();
}
如果这不能解决问题,您应该查看堆栈跟踪以获取线索。
您的 secondLevel
class 缺少构造函数。这意味着永远不会调用 Load()
和 Initialize()
方法。要修复此错误,请添加调用这些方法的构造函数。
示例:
public secondLevel(){
this.Initialize();
this.Load();
}
另一件事:您不应该为每个新级别制作一个全新的 class。相反,你应该有一个 Level
结构(或者 class,如果你真的想要的话),它具有关卡的所有属性。然后,要创建新关卡,只需执行 Level secondLevel = new Level(map,size);
因为我目前正在制作一款 2D 游戏,所以我试图让我的角色能够在关卡之间加载,但我遇到了一些问题。我的播放器开始的第一个级别被加载到一个数组中,在 Game1
class 中完全没有问题,如下所示:
secondLevel secondLev; // instance for secondLevel class
Map map; // instance for Map class
secondLev = new secondLevel(); // used in the Initialize() function
protected override void LoadContent()
{
map.Generate(new int[,] {
// 0 = no tile drawn
// 3 = tile is drawn
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
}, 57); // size
}
所以为了能够加载第二个级别,我尝试创建一个名为 secondLevel
的新 class 来保存新的级别数组,并简单地将数组加载到其 Load()
函数,像这样:
class secondLevel
{
Map map;
public void Initialize()
{
map = new Map();
}
public void Load()
{
map.Generate(new int[,] {
// 0 = no tile drawn
// 3 = tile is drawn
{0,0,0,0,0,0,0,0,0,0,},
{0,0,0,0,0,0,0,0,0,0,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
{3,3,3,3,3,3,3,3,3,3,},
}, 57); // size
}
}
现在在我的 Game1
class 中,我放置了一个 if statement
来检查玩家是否与加载下一关卡的尖峰发生碰撞,如下所示:
if (player.Bounds.Intersects(spike1.Bounds)) // if player intersects with spike
{
secondLev.Load();
}
但是当我的播放器与尖峰相交时,我的游戏冻结并且我收到错误消息:Object reference not set to an instance of an object
。
我的问题是什么?
如果我的问题中遗漏了任何可以帮助您解决此问题的附加代码,请告诉我!
由于缺乏上下文,很难说出究竟是什么原因造成的。但是,如果在您提供的代码 中发生异常,则可能未初始化以下代码之一:secondLev
或 secondLev.map
.
if (player.Bounds.Intersects(spike1.Bounds)) // if player intersects with spike
{
secondLev = new secondLevel();
secondLev.Initialize();
secondLev.Load();
}
如果这不能解决问题,您应该查看堆栈跟踪以获取线索。
您的 secondLevel
class 缺少构造函数。这意味着永远不会调用 Load()
和 Initialize()
方法。要修复此错误,请添加调用这些方法的构造函数。
示例:
public secondLevel(){
this.Initialize();
this.Load();
}
另一件事:您不应该为每个新级别制作一个全新的 class。相反,你应该有一个 Level
结构(或者 class,如果你真的想要的话),它具有关卡的所有属性。然后,要创建新关卡,只需执行 Level secondLevel = new Level(map,size);