我的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中,程序显然在出现错误后停止。
希望你们可以在这里帮助我。
答案 0 :(得分:2)
在第一个kk循环中删除子弹[ll]。因此,在随后的kk循环中,bullet [ll]不再存在(即ll-1是“最高”的现有索引)...