我在这里有一个真正的脑筋急转弯,我无法弄清楚我做错了什么,因为代码看起来绝对正常。
少量背景信息:自从我开始在 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:如果有什么不清楚的地方,我很乐意编辑这个问题!