使用List进行碰撞检测

时间:2014-12-03 15:32:33

标签: c# xna

我得到了一个名为物体和子弹列表的敌人名单。

private List<enemyObjects> objects = new List<enemyObjects>();

list个对象位于Game1类中。

我使用以下方法添加和删除列表中的敌人:

public void LoadEnemies() {
        int Y = 100;
        if (spawn >= 1) 
        {
            spawn = 0;
            if (objects.Count() < 4)
                objects.Add(new enemyObjects(Content.Load<Texture2D>("obstacle"), new Vector2(1100, Y)));
        }

        for (int i = 0; i < objects.Count; i++)
        {
            if (!objects[i].isVisible)
            {
                //If the enemy is out of the screen delete it
                objects.RemoveAt(i);
                i--;
            }
        }
    }

我还有一份子弹列表:public List<Bullet> bullets = new List<Bullet>(); 我发射子弹的方法:

private void ShootFireBall() {
        if (mCurrentState == State.Walking)
        {
            bool aCreateNew = true;
            foreach (Bullet aBullet in bullets)
            {
                if (aBullet.bulletVisible == false)
                {
                    aCreateNew = false;
                    aBullet.Fire(position + new Vector2(Size.Width / 2, Size.Height / 2),
                        new Vector2(200, 0), new Vector2(1, 0));
                }
            }

            if (aCreateNew)
            {
                Bullet aBullet = new Bullet();
                aBullet.LoadContent(contentManager, "bullet");
                aBullet.Fire(position + new Vector2(Size.Width / 2, Size.Height / 2),
                       new Vector2(200, 0), new Vector2(1, 0));
                bullets.Add(aBullet);
            }
        }
    }

问题是我需要一个矩形,所以我可以检查是否有碰撞。 如何检查2个列表的冲突? 有没有办法将其转换为Rectangle? 被困在这几个小时,真的无法弄清楚。

1 个答案:

答案 0 :(得分:2)

我通常都拥有所有精灵来自普通类型。雪碧,GameEntity等等。该基本类型将公开BoundsLocation等属性

类似的东西:

public abstract class Sprite
{
    public Vector2 Location { get; set; }
    public Rectangle Bounds
    {
        get
        {
            return new Rectangle((int)Location.X, (int)Location.Y, 
                                 _texture.Width, _texture.Height);
        }
    }

    private Texture2D _texture;

    public Sprite(Texute2D texture)
    {
        _texture = texture;
    }
}

public class enemyObjects : Sprite
{

    // enemy-specific properties go here

    public enemyObjects(Texture2D texture)
        : base(texture)
    {
    }
}

public class Bullet : Sprite
{

    // Bullet-specific properties go here

    public Bullet(Texture2D texture)
        : base(texture)
    {
    }
}

然后你可以简单地使用objects[i].Bounds来获得一个包含该对象的矩形。