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;
我正在 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;