0

我在这里有一个真正的脑筋急转弯,我无法弄清楚我做错了什么,因为代码看起来绝对正常。

少量背景信息:自从我开始在 XNA/MonoGame 环境中工作大约 2 天以来,我想从一些简单的事情开始。我目前正在构建类似游戏的 astroid 防御者,并且正在进行碰撞检查。在发生碰撞之前,我发现当我使用 for 循环遍历列表中的所有敌人时,我得到了一个相当奇怪的空引用。然而,该列表属于另一类。

在启动时,我初始化了一个 SpawnManager 类,当类被创建时立即创建 20 个敌人,如下所示:

class SpawnManager
{
    //Draw
    ContentManager myContentManager;

    //Enemies
    public List<Enemy> enemy = new List<Enemy>();

    public void LoadContent(ContentManager theContentManager)
    {
        myContentManager = theContentManager;

        for (int i = 0; i < 20; i++)
        {
            Enemy newEnemy = new Enemy(new Vector2((800 / (20 + 1) * i + 16.5f), 20), 500, 50, 25, 10, 2500, 100, 1, 3, 2, false);
            newEnemy.LoadContent(myContentManager);
            enemy.Add(newEnemy);
        }
    }

然后每当我用我的宇宙飞船发射子弹时,它都会创建一个子弹类,如下所示:

public class Bullet : PlayerScript
{
    //Enemy enemy;
    SpawnManager spawnManager;
    PlayerScript playerScript;

    private Texture2D _bullet;
    private Rectangle _hitBox;
    public float xPos = 0;
    public float yPos = 0;

    public bool isActive = false;

    public void LoadContent(ContentManager theContentManager)
    {
        _bullet = theContentManager.Load<Texture2D>("Graphics/citem");
        _hitBox = new Rectangle(0, 0, _bullet.Width, _bullet.Height);
    }

    public void Update(GameTime gameTime)
    {
        //Movement.
        yPos -= 13.5f;

        //Collision.
            for (int i = 0; i < spawnManager.enemy.Count; i++)
            {
                //Console.WriteLine(spawnManager.enemy.Count);
            }
     }

当我保持空间发射子弹时,我立即得到一个空引用错误,突出显示 for 循环部分。我在互联网上读过一些帖子,说敌人列表可能为空或为空,但即使是这样,这也不重要,因为我的代码结构如下:

Game1 初始化 -> 添加 SpawnManager -> 添加 Enemies + 将它们推送到 Enemy 列表中。

所以当敌人出现在屏幕上时,他们基本上已经被添加到了 Enemy 列表中,并且 List 不应该为 null 或为空。

此外,是否有更简单或更有效的方法来检查碰撞?因为每次我创建子弹时,bullet.Update 脚本都会像疯子一样开始循环遍历所有敌人,直到它到达一个敌人,检查它是哪个敌人,对其应用更改并将其自身添加到池中。(当然,当它在池中时,我不会更新 Bullet 脚本)。由于这个 astroid 防御者更像是一个小子弹地狱,每秒钟发射 100 发子弹,总共会造成很多循环。在 Unity 工作了 1.5 年后,我刚刚来到 XNA / MonoGame C#,在 Unity 中一切似乎都很简单,OnCollisionEnter ftw!:)

尽管如此,我很确定这是我身边的一个总的 ID-10-T 错误,但我无法理解它,任何帮助将不胜感激:)

PS:如果有什么不清楚的地方,我很乐意编辑这个问题!

4

0 回答 0