太空入侵者健康/阵列问题

时间:2012-04-19 12:01:58

标签: c# .net xna

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

它只发生在最右边,但我可以假设它也会发生在左边 - 我假设我也可以应用相同的逻辑将此错误修复到左侧。

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

提前感谢您的帮助!

1 个答案:

答案 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
}