我在这里有一个真正的脑筋急转弯,我无法弄清楚我做错了什么,因为代码看起来绝对正常。
背景资料不多: 由于我已经开始在XNA / MonoGame环境中工作大约2天了,所以我想从容易开始的事情开始。我正在建造像游戏一样的星形防御者,我正在进行碰撞检查。在我碰到碰撞之前,我发现当我使用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初始化 - &gt;添加SpawnManager - &gt;添加敌人+将其推入敌人列表。
因此当敌人在屏幕上时,他们基本上已经被添加到敌人列表中,并且列表不应该为空或空。
此外,是否有更简单或更有效的方法来检查碰撞?因为每当我创建一个子弹时,bullet.Update脚本将开始循环遍历所有敌人,如疯子,直到它到达敌人,检查它是哪个敌人,对其应用更改并将其自身添加到池中。 (当然在游泳池中我不会更新Bullet脚本)。由于这个星形防御者更像是一个小小的子弹地狱,每几秒射出100发子弹,总会造成很多循环。我在Unity工作了1.5年之后,刚刚来到XNA / MonoGame C#,在Unity中,一切看起来都很简单,OnCollisionEnter ftw! :)
尽管如此,我很确定我的ID-10-T总错误,但我无法绕过它,任何帮助都会感激不尽:)
P.S:如果说不清楚,我很乐意编辑这个问题!