我一直在做一些练习来学习C#。我一直在做XNA并制作太空入侵者克隆。
到目前为止,一切都很花哨,但在编码时我遇到了一些问题。
问题和支持代码如下:
我的入侵者排名第一,有2点生命值,2次点击可以摧毁并获得更多积分。然而,当一个被击中并被摧毁时,行顶部的其余部分减少到1个HP,然后用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);
}
}
它只发生在最右边,但我可以假设它也会发生在左边 - 我假设我也可以应用相同的逻辑将此错误修复到左侧。
如果这还不够,我可以提供更多信息和摘要。
提前感谢您的帮助!
答案 0 :(得分: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;
}
对于第二个错误,如果您的集合为空(在您杀死所有类型5入侵者之后),FirstOrDefault
方法将返回null
。您只需要检查它是否为空,如下所示:
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
}