Индекс списка вне границ при удалении элементов из TObjectList - PullRequest
0 голосов
/ 03 февраля 2019

У меня небольшая, но раздражающая проблема с моим проектом Delphi School.В школе мы должны использовать 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 Ответ

0 голосов
/ 04 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...