我在XNA 4.0中使用C#製作Space Invaders克隆,並遇到了一些問題。首先,當我拍攝陣列右側列上的所有入侵者,但最頂端的一列時,入侵者將移出屏幕直到下一列達到預定限制;然後整個陣列向下移動。顯然我希望它能夠檢測到剩餘的入侵者。我很確定問題出現在以下代碼部分,但我不確定問題在哪。C#XNA 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是未處理」在這片碼通知:
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;
}
}
任何有關這兩個問題的幫助都將不勝感激。
你的第一個循環是不是在0指數迭代,是預期的行爲?不應該是行> = 0和cols> = 0? –
另外,你的'break'語句只會打破內部循環。外循環繼續,這可能不是你想要的。引入一個變量來決定是否繼續外部循環。如果沒有找到合適的元素,則'RightInvader'可能爲'null'。你應該在訪問它的'GetXPos()'之前檢查它。 –
當你「殺死」一個入侵者時,你可能需要發佈你用來修改InvaderArray的代碼。你是否將它設置爲null或其他值? –