Форум: "Игры";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизDullets Найти похожие ветки
← →
Filther (2004-02-29 11:50) [0]У меня для описания пуль введены следующие типы
Type
PBulletInfo=^TBulletInfo;
TBulletInfo=Record
X,Y:Integer;
Xinc,Yinc:Integer;
BulletClass:Integer;
End;
Type TBulletsArray=Record
Width:Integer;
Bullets:TList;
End;
И при перещете координат нужно чтобы пуля которая вылетела за
пределы убиралась из списка, но возникает исключение Acsess Violation.
Подскажите что в этой процедуре не так?
Procedure BulletNewCoords;
Var I:Integer;
Ret:PReturnType;
Temp:PBulletInfo;
Begin
If BulletsArray.Width>0 Then Begin
For I:=0 To BulletsArray.Bullets.Count-1 Do begin
Temp:=BulletsArray.Bullets.Items[i];
Temp^.X :=Temp^.X+Temp^.Xinc;
Temp^.Y :=Temp^.Y+Temp^.Yinc;
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then Begin
BulletsArray.Bullets.Delete(I);
Dispose(Temp);
End;
End;
End;
End;
← →
cyborg © (2004-02-29 11:56) [1]Удаляешь, индексы меняются, и на последних выходит ацесс виолатион, так, как их уже нет.
← →
cyborg © (2004-02-29 11:58) [2]К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
← →
Filther (2004-02-29 12:11) [3]>Удаляешь, индексы меняются, и на последних выходит ацесс виолатион, так, как их уже нет.
Thanks ошибку понял
>К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
Дык в хелпе написано следующее:
Note: Delete does not free any memory associated with the item.
← →
cyborg © (2004-02-29 12:21) [4]
> >К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
> Дык в хелпе написано следующее:
> Note: Delete does not free any memory associated with the
> item.
Возможно, я не проверял, закомментируй, если ошибка исчезнет, может дело в этом.
← →
cyborg © (2004-02-29 12:23) [5]memory associated
Я понимаю, которые прикреплены к Data вроде или чего-то подобное там, а сам итем по идее должен удаляться.
← →
Filther (2004-02-29 12:51) [6]Блин лажанулся !:
Procedure BulletNewCoords;
Var I:Integer;
Ret:PReturnType;
Temp:PBulletInfo;
Begin
If BulletsArray.Width>0 Then Begin
For I:=0 To BulletsArray.Bullets.Count-1 Do begin
Temp:=BulletsArray.Bullets.Items[i];
Temp^.X :=Temp^.X+Temp^.Xinc;
Temp^.Y :=Temp^.Y+Temp^.Yinc;
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then Begin
BulletsArray.Bullets.Delete(I);
Dispose(Temp);
Dec(BulletsArray.Width);
End;
End;
End;
End;
Но Dispose(Temp) все-таки нужен!
← →
Filther (2004-02-29 12:56) [7]Нет все таки рабочий вариант такой:
Procedure BulletNewCoords;
Var I:Integer;
Ret:PReturnType;
Temp:PBulletInfo;
Begin
If BulletsArray.Width>0 Then Begin
I:=0;
Repeat
Temp:=BulletsArray.Bullets.Items[i];
Temp^.X :=Temp^.X+Temp^.Xinc;
Temp^.Y :=Temp^.Y+Temp^.Yinc;
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then Begin
BulletsArray.Bullets.Delete(i);
Dec(BulletsArray.Width);
Dispose(Temp);
End;
I:=I+1;
Until I>BulletsArray.BulletS.Count-1;
End;
End;
Спасибо за подсказку, вопрос исчерпан!
← →
cyborg © (2004-02-29 13:12) [8]Подозреваю, что будет глюк с пропуском, например ты удалил восьмую, девятая при этом становится восьмой, а ты перескакиваешь на девяиую, в итоге девятая, которая впоследствии, после удаления, становится восьмой "пролетает" в этом цикле.
← →
cyborg © (2004-02-29 13:14) [9]сделай так:
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then
Begin
BulletsArray.Bullets.Delete(i);
Dec(BulletsArray.Width);
Dispose(Temp);
End else I:=I+1;
← →
VMcL © (2004-02-29 13:20) [10]>>Filther (29.02.04 11:50)
>For I:=0 To BulletsArray.Bullets.Count-1 Do begin
For I:=BulletsArray.Bullets.Count-1 downto 0 Do begin
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c