使用列表进行冲突检测

本文关键字:冲突检测 列表 | 更新日期: 2023-09-27 18:33:08

我得到了一个叫做物体的敌人列表和一个子弹列表。

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 个列表的冲突?有没有办法将其转换为矩形?被困在这个上面几个小时,真的想不通。

使用列表进行冲突检测

我通常让我所有的精灵都派生自一个常见的类型。雪碧,游戏实体,随便什么。该基类型将公开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 来获取包含对象的矩形。