从 TObjectList 中删除元素时列表索引超出范围

List Index Out Of Bounds when deleting elements from TObjectList

我的 Delphi 学校项目遇到了一个小而烦人的问题。在学校,我们必须使用 Delphi 5(我知道,非常现代)并且能够在没有 运行 的情况下自行处理它,我在这里使用 Delphi 7拉撒路的。

我正在尝试使用我们在课程中学到的有限 OpenGL 知识编写一个小型 Space Invaders 项目,我 运行 在检查玩家子弹之间的碰撞时陷入了这个问题射击和敌人。 碰撞检测代码实际上有效并相应地计算命中数但是当它必须从列表中删除敌人和子弹时(这样它们就不会再被渲染),列表索引越界错误发生。

procedure TForm1.CheckCollision(enemies, bullets: TObjectList);
var ll, kk: integer;
begin
  for ll := Form1.bullets.Count-1 downto 0 do
  begin
      for kk := Form1.enemies.Count-1 downto 0 do
      begin
        if TBullet(Form1.bullets[ll]).tby1 >= TEnemy(Form1.enemies[kk]).tey1 then
        begin
          if TBullet(Form1.bullets[ll]).tbx2 > TEnemy(Form1.enemies[kk]).tex1 then
          begin
            if TBullet(Form1.bullets[ll]).tbx1 < TEnemy(Form1.enemies[kk]).tex1 + 0.05 then
              begin
                if TBullet(Form1.bullets[ll]).tby1 <= TEnemy(Form1.enemies[kk]).tey2 then
                begin
                  Form1.enemies.Delete(kk); //error happens here and line below
                  Form1.bullets.Delete(ll);
                  inc(score);
                end;
              end;
          end;
        end;
      end;
  end;
end;

这是发生此错误的代码。我有点知道这个错误是什么意思,但我不知道在这种情况下如何修复它。有趣的是,虽然在这个项目的.exe中仍然出现这个错误,子弹和敌人都被删除了,你的分数也增加了,你只需要在出现错误信息后快速按确定就可以继续玩了。 Delphi中,明显报错后程序停止。

希望你们能帮我解决这个问题。

Bullet[ll]在第一个kk循环中被删除。因此,在随后的 kk 循环中,bullet[ll] 不再存在(即 ll - 1 是 "highest" 现有索引)...