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

我的问题是什么?

如果我的问题中遗漏了任何可以帮助您解决此问题的附加代码,请告诉我!

由于缺乏上下文,很难说出究竟是什么原因造成的。但是,如果在您提供的代码 中发生异常,则可能未初始化以下代码之一:secondLevsecondLev.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);