2012-04-19 35 views
0

我一直在做一些練習來學習C#。我一直在做XNA並製作太空侵略者克隆。太空侵略者健康/陣列問題

到目前爲止,一切都很花哨,但是我在編碼時遇到了一些問題。

的問題和支持的代碼如下:

我侵略者行的頂部有2個健康點,採取2次命中摧毀,併產生更多的積分。然而,當一個人被擊中並被摧毀時,其餘的頂部行會降低到1HP,並且受到1次擊打摧毀 - 這不是我想要的結果。

有問題的代碼我懷疑是:

if (playerBullet != null && Type1Invaders != null) 
     { 
      Rectangle rectMissile = new Rectangle((int)playerBullet.getX(), playerBullet.getY(), playerBulletIMG.Width, playerBulletIMG.Height); 
      for (int count = 0; count < 11; count++) 
      { 
       Rectangle rectInvader = new Rectangle(Type1Invaders[count].getX(), Type1Invaders[count].getY(), invader1.Width, invader1.Height); 
       if (Type1Invaders[count].getVis() && rectMissile.Intersects(rectInvader)) 
       { 
        Type1Invaders[count].setHP(Type1Invaders[count].getHP() - 1); 
        shootTimer = 0; 
        if (Type1Invaders[count].getHP() == 0) 
        { 
         explosionInstance.Play(); 
         playerBullet = null; 
         Type1Invaders[count].setVis(false); 
         score = score + Type1Invaders[count].getPointValue(); 

        } 
       } 
      } 
     } 

我的第二個錯誤在於我如何檢測在一排最左邊和最右邊的侵略者。當整行被銷燬時,我得到一個nullreferenceerror。 (這些都是一個噩夢..)

無論如何,這是有問題的代碼

發現左邊和最右邊的侵略者

var LeftMost5 = Type5Invaders.Where(i => i.getVis()).FirstOrDefault(); 
var RightMost5 = Type5Invaders.Where(i => i.getVis()).LastOrDefault(); 

的方法和if語句拋出零誤差

if (RightMost5.getX() >= RightGameEdge) 
     { 
      Type5.setDir(-1); 
      for (int count = 0; count < 11; count++) 
      { 
       invaderMoveInstance5.Play(); 
       Type5Invaders[count].MoveY(8); 
      } 
     } 

它只發生在最右邊,但我可以認爲它會發生在左邊 - 我假設我可以應用相同的邏輯來修復這個錯誤到左側O操作。

如果這還不夠,我可以提供更多信息和片段。

在此先感謝您的幫助!

+0

檢查你的Intersects代碼 - 它有可能對每個入侵者返回「true」。 – 2012-04-19 12:08:43

+0

第二個問題 - RightMost5/LeftMost5的情況是空的檢查?什麼是你的收藏默認值? – cookieMonster 2012-04-19 12:12:09

+0

第一個問題 - 什麼是侵入者1? – cookieMonster 2012-04-19 12:13:39

回答

3

第一期。我想當一顆子彈殺死一個入侵者時,你可以說那個子彈不會殺死另一個入侵者。因此,您可以添加一個break;來停止循環。就像這樣:

if (Type1Invaders[count].getVis() && rectMissile.Intersects(rectInvader)) 
{ 
    Type1Invaders[count].setHP(Type1Invaders[count].getHP() - 1); 
    shootTimer = 0; 
    if (Type1Invaders[count].getHP() == 0) 
    { 
    explosionInstance.Play(); 
    playerBullet = null; 
    Type1Invaders[count].setVis(false); 
    score = score + Type1Invaders[count].getPointValue(); 
    } 
    break; 
} 

對於第二個錯誤,FirstOrDefault方法返回null的情況下,你的收藏是空的(你已經殺死了所有5型侵略者之後)。你只需要檢查它是否爲空,如下所示:

var LeftMost5 = Type5Invaders.Where(i => i.getVis()).FirstOrDefault(); 
var RightMost5 = Type5Invaders.Where(i => i.getVis()).LastOrDefault(); 

if(RightMost5 != null) 
{ 
    // this means we have a non-null invader 
    if (RightMost5.getX() >= RightGameEdge) 
    { 
     Type5.setDir(-1); 
     for (int count = 0; count < 11; count++) 
     { 
      invaderMoveInstance5.Play(); 
      Type5Invaders[count].MoveY(8); 
     } 
    } 
} 
else 
{ 
    //this means that the invader does not exist anymore, so we do nothing 
} 
+0

非常感謝您的幫助。我確信我從解決方案的形式嘗試了第二個問題,但我不認爲我使用了else語句。 但是,我對問題1的問題仍然存在,無論提出的更改如何。 – user1308880 2012-04-19 13:13:01

+0

你不需要使用else語句,它只是爲了完整性。至於問題1,使用調試器逐行掃描循環,看看爲什麼它會減少該行上所有入侵者的健康狀況。 – Ove 2012-04-19 15:45:26

+0

嗯,我已經做到了。 2HP看起來入侵者似乎正在以一擊擊敗所有的HP。我會做更多的測試。 – user1308880 2012-04-19 17:27:44