0

我一直在做一些练习来学习 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);
            }
        }

它只发生在最右边,但我可以假设它也会发生在左边——我假设我可以应用相同的逻辑来修复这个错误到左边。

如果这还不够,我可以提供更多信息和片段。

提前感谢您的帮助!

4

1 回答 1

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
}
于 2012-04-19T12:12:21.303 回答