C#XNA Space Invaders问题

时间:2015-04-22 18:30:31

标签: c# xna

我在XNA 4.0中使用C#制作太空入侵者克隆,但我遇到了几个问题。第一个是当我在阵列的右侧列上射击所有入侵者但最顶层的入侵者时,该入侵者在屏幕外移动直到下一列达到预定极限;然后整个阵列向下移动。显然我希望它仍能检测到剩余的入侵者。我很确定问题出在下面的代码部分,但我不确定问题是什么。

    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'关于这段代码的通知:

    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;
            }
        }

非常感谢任何一个问题的帮助。

1 个答案:

答案 0 :(得分:2)

所以你可能会遇到一些错误。看看你的代码,看起来你使用了很多魔法&#39;到处都是数字第一步是删除所有4s,10s,5s和11s,并创建一些公共常量:

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--)

目前,您的循环从不测试col或第0行。

编辑:  我错过了&#39;休息&#39;问题。解决这个问题的简单方法是:

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

然后将发现设置为true而不是破坏。 另一种方法是将嵌套循环放在函数中,并在找到所需内容时返回。

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

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