我一直在做一些练习来学习 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);
}
}
它只发生在最右边,但我可以假设它也会发生在左边——我假设我可以应用相同的逻辑来修复这个错误到左边。
如果这还不够,我可以提供更多信息和片段。
提前感谢您的帮助!