C# XNA Space 入侵者问题

C# XNA Space Invaders issue

我正在 XNA 4.0 中使用 C# 制作一个 Space Invaders 克隆,我 运行 遇到了几个问题。第一个是,当我射击阵列右侧列中的所有入侵者时,但最上面的那个入侵者会移出屏幕,直到下一列达到预定限制;然后整个阵列向下移动。显然我希望它仍然检测到剩余的入侵者。我很确定问题出在以下代码部分,但我不确定问题出在哪里。

    for (int rows = 4; rows > 0; rows--) // Detects right-most invader
        for (int cols = 10; cols > 0; cols--)
        {
            if (InvaderArray[rows, cols] != null)
            {
                RightInvader = InvaderArray[rows, cols];
                break;
            }
        }

第二个问题是,如果我消灭除了一排入侵者以外的所有入侵者,我会在这段代码上收到 'NullReferenceException was unhandled' 通知:

    if (RightInvader.GetXPos() > 800) // Right edge limit
    {
        InvaderDir = -1;

        for (int rows = 0; rows < 5; rows++)
            for (int cols = 0; cols < 11; cols++)
            {
                if (InvaderArray[rows, cols] != null) 
                {
                    InvaderArray[rows, cols].MoveVertical(8);
                }
            }
    }

同样,不确定是什么问题。下面是检测剩余入侵者的代码:

    // Detecting remaining invader
    bool InvaderFound = false;

    for (int rows = 0; rows < 5; rows++)
        for (int cols = 0; cols < 11; cols++)
        {
            if (InvaderArray[rows, cols] != null)
            {
                InvaderFound = true;
                break;
            }
        }

非常感谢任何有关这两个问题的帮助。

所以您可能会遇到一些错误。查看您的代码,您似乎到处都使用了很多 'magic' 数字。第一步是删除所有 4s、10s、5s 和 11s,并创建一些 public 常量:

static readonly int NumRows = 5;
static readonly int NumColumns = 11;

现在,您的代码的第一部分目前从不测试第 0 行或第 0 列,这可能会导致您看到的一些问题。 您的循环现在可以写成:

for (int rows = NumRows - 1; rows >= 0; rows--)
    for (int cols = NumCols - 1; cols >= 0; cols--)

目前,您的循环从未测试第 0 列或第 0 行。

编辑: 我错过了 'break' 问题。一个简单的解决方法是:

bool found = false;
for (int rows = NumRows - 1; rows >= 0 && !found; rows--)
    for (int cols = NumCols - 1; cols >= 0 && !found; cols--)

然后将 found 设置为 true 而不是 breaking。 另一种方法是将嵌套循环放在一个函数中,然后 return 当你找到你想要的东西时。

例如,您找到的函数可以写成:

for (int rows = 0; rows < NumRows ; rows++)
    for (int cols = 0; cols < NumCols; cols++)
    {
        if (InvaderArray[rows, cols] != null)
        {
            return true;
        }
    }
}
return false;