我一直在做一些練習來學習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操作。
如果這還不夠,我可以提供更多信息和片段。
在此先感謝您的幫助!
檢查你的Intersects代碼 - 它有可能對每個入侵者返回「true」。 – 2012-04-19 12:08:43
第二個問題 - RightMost5/LeftMost5的情況是空的檢查?什麼是你的收藏默認值? – cookieMonster 2012-04-19 12:12:09
第一個問題 - 什麼是侵入者1? – cookieMonster 2012-04-19 12:13:39