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

时间:2019-02-03 20:50:15

标签: delphi delphi-7 tobjectlist

我的Delphi School Project遇到了一个小而烦人的问题。在学校里,我们必须使用Delphi 5(我知道,它非常现代),并且能够独自处理它而不会遇到大麻烦,我在这里使用Delphi 7代替Lazarus。

我正在尝试使用我们在课程中教授的有限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中此错误仍然发生,子弹和敌人都被删除并且您的得分得到了提高,您只需要在错误消息出现后快速按OK即可继续播放。在Delphi中,程序显然在出现错误后停止。

希望你们可以在这里帮助我。

1 个答案:

答案 0 :(得分:2)

在第一个kk循环中删除子弹[ll]。因此,在随后的kk循环中,bullet [ll]不再存在(即ll-1是“最高”的现有索引)...

相关问题