Индекс списка вне границ при удалении элементов из TObjectList

У меня небольшая, но раздражающая проблема с моим школьным проектом Delphi. В школе мы должны использовать Delphi 5 (я знаю, очень современно) и чтобы иметь возможность работать над ним самостоятельно, не сталкиваясь с большими неприятностями, я использую здесь Delphi 7 вместо Lazarus.

Я пытаюсь закодировать небольшой проект Space Invaders с ограниченными знаниями OpenGL, которым мы научились на наших уроках, и сталкиваюсь с проблемой при проверке столкновений между пулями, которые стреляет игрок и врагами. Код обнаружения столкновений фактически работает и подсчитывает попадания соответствующим образом, но когда ему нужно удалить врага и пулю из списка (чтобы они больше не отображались), возникает ошибка "Индекс списка вне границ".

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 ответ

Решение

Пуля [ll] удаляется в первом цикле kk. Следовательно, в последующих циклах kk bullet[ll] больше не существует (т. Е. Ll - 1 является "самым высоким" существующим индексом)...

Другие вопросы по тегам