C#->;索引超出范围错误|使用列表

本文关键字:错误 列表 范围 gt 索引 C#- | 更新日期: 2023-09-27 18:28:53

我正在使用XNA制作坦克游戏。我已经实现了一个使用列表发射子弹的功能。拍摄结束后,我想测试子弹是否已经接近屏幕的边界。如果是,请从列表中删除该项目符号。

只有当我在任何给定时间屏幕上有多个项目符号时,才会出现错误。这是代码:


储罐等级:

List<Bullet> bulletList = new List<Bullet>();
bool spacebarPrepared = true;    //for shooting every 0.5 seconds
short count = 0;

//Shoot
if (Keyboard.GetState().IsKeyDown(Keys.Space) && spacebarPrepared == true)
   {
        bulletList.Add(new Bullet(sprBullet, position, turretDirection, turretAngle));
        spacebarPrepared = false;
   }

if (spacebarPrepared == false)
    {
        spacebarCount += (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (spacebarCount > 0.5)
        {
            spacebarPrepared = true;
            spacebarCount = 0;
        }
    }

//Update bullets
foreach (Bullet bullet in bulletList)
{
    bullet.Update(bounds);
}

count = (short)bulletList.Count;
//Remove unwanted bullets
for (short i = 0; i < count; i++)
{
    if (bulletList[i].Alive == false)
    {
        bulletList.Remove(bulletList[i]);
    }
 }

子弹等级:

class Bullet
{
    Texture2D spr;
    Vector2 origin, pos, dir, turretLength;
    float rotation, scale, turretLeng;
    short speed;
    bool alive = true;

    public Bullet(Texture2D sprite, Vector2 position, Vector2 direction, float angle)
    {
        spr = sprite;
        scale = 0.15f;
        turretLeng = (110 + spr.Width) * scale;
        speed = 5;
        rotation = angle;
        pos = position;
        dir = direction;
        origin = new Vector2(spr.Width / 2, spr.Height / 2);
        FindTurretLength();
    }
    public void Draw(SpriteBatch spriteBatch)
    {
        Matrix bulletTranslation = Matrix.CreateRotationZ(rotation) * Matrix.CreateTranslation(pos.X + turretLength.X, pos.Y + turretLength.Y, 0);
        spriteBatch.Begin(SpriteSortMode.BackToFront, null, null, null, null, null, bulletTranslation);
        spriteBatch.Draw(spr, Vector2.Zero, null, Color.White, 0, origin, 0.15f, SpriteEffects.None, 1f);
        spriteBatch.End();
    }
    public void Update(Vector2 boundary)
    {
        pos += dir * speed;

        if (pos.X < 50 || pos.X > boundary.X - 50 || pos.Y < 50 || pos.Y > boundary.Y - 50)
        {
            alive = false;
        }
    }
    public void FindTurretLength()
    {
        turretLength = new Vector2(turretLeng * dir.X, turretLeng * dir.Y);
    }
    public Vector2 Pos
    {
        get
        {
            return pos;
        }
        set
        {
            pos = value;
        }
    }
    public bool Alive
    {
        get
        {
            return alive;
        }
        set
        {
            alive = value;
        }
    }
}

调试时,我注意到自己的"count"变量为2,而bulletList.count=1。这可能是问题所在吗?这是怎么发生的?

非常感谢您的帮助。

C#->;索引超出范围错误|使用列表

问题出在移除项目符号的for循环中。

假设您在开始循环时有一个包含10个项目符号(索引0-9)的列表。第一个项目符号(位于索引0处)已删除。。。。现在您的列表有9个项目符号(索引为0-8),但count变量尚未更新,所以for循环仍然认为它有10个。

当你到达"i"大于实际子弹数量的点时,你会得到"索引超出范围"错误。

有多种方法可以修复此错误。

我会选择:

bulletList.RemoveAll(x => !x.Alive);