Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

GLScene: Удаление объекта после анимации.   Найти похожие ветки 

 
kas-t   (2004-06-14 00:17) [0]

Не получается удалить объект. Дело в том, что нужно удалить объект TGLActor после того как закончилась его анимация. Пробовал делать так:


.....
begin
 MyActor.SwitchToAnimation("dead",True);
 MyActor.OnEndFrameReached:=Dead;
end;

.....
procedure Dead(Sender: TObject);
begin
 with Sender as TGLActor do begin
   Destroy;
   end;
end;


Вылетает ошибка... :( Наверное я не правильно удаляю объект. В том смысле, что он пытается, как бы сам себя удалить. Может, кто, что подскажет по этому поводу?

ЗЫ: Если удалять не через событие OnEndFrameReached методом MyActor.Destroy то все отлично удаляется.


 
DeadMeat ©   (2004-06-14 01:41) [1]

Тады попробуй установить какой-нибудь параметр в твоем Dead, проверка которого будет осуществляться гдето ещё... Например в OnProgress у GLCadencer... Это конечно не очень правильный способ, но принцип состоит в синхрогизации двух операций...

---
...Death Is Only The Begining...


 
kas-t   (2004-06-14 04:43) [2]

to DeadMeat: Это кстати первое, что мне пришло в голову. В место Destroy я писал AnimationMode:=aamNone; после чего (так, для проверки) вешал небольшую процедуру на клавишу, которая пробегала по всем объектам TGLActor и проверяла его на наличие AnimationMode, если анимация была отключена то объект должен был уничтожатся. Но появилась ошибка в условии на проверку режима анимации, проверял, именно в условии. А почему не знаю. Условие было таким:

if CurretObject[x].AnimationMode=aamNone then CurretObject[x].Destroy;


Это меня не остановило, и я попробовал менять Tag объекта как отметку что это именно тот объект, который мне нужно уничтожить. Аналогичная ошибка была и тут.

ЗЫ: Может быть, конечно, проблема и в кривых руках :), но что то мне так не кажется. На свежую голову еще все внимательно у себя в коде осмотрю.


 
КиТаЯц ©   (2004-06-15 07:37) [3]

Я вот как-то тоже с удалением объектов ковырялся... Удалял по таймеру. Тупо, конечно, по таймеру, но когда в сцене не более десятка объектов... Ну ладно, вот код; ошибок не было.
procedure TMainForm.TimerTimer(Sender: TObject);
var I: Integer;
begin
  FControl.Caption := Format("%.1f FPS", [GLSceneViewer.FramesPerSecond]);
  GLSceneViewer.ResetPerformanceMonitor;
  for I:=0 to GLScene.Objects.Count-1 do
   if  (GLScene.Objects[i].ClassName = "tPeople")
   and (tPeople(GLScene.Objects[i]).psLife <= 0)
   then begin
     tPeople(GLScene.Objects[i]).Destroy;
     break;
     end;
end;

Да, tPeople, это типа расширенный tActor...


 
kas-t   (2004-06-15 07:52) [4]

По таймеру удалять это конечно мысль, но не самое красивое решение. По пробую еще по думать, может чего и получится.


 
kerby ©   (2004-06-15 11:25) [5]

Я делаю так
type tmyactor=class
private

myactor:tglactor;
procedure actor_progress(Sender: TObject; const deltaTime,newTime: Double);

public

constructor create(......)

end;

constructor tmyactor.create(....)
begin

.....
.....
actor.OnProgress:=actor_progress;

end;

procedure tmyactor.actor_progress(Sender: TObject; const deltaTime,
 newTime: Double);
begin

if Dead then freeandnil(actor);

end;


 
КиТаЯц ©   (2004-06-15 11:37) [6]

FreeAndNil таким образом работает
procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;

А теперь такой общий вопрос: что все-таки лучше (правильней) .Free или .Destroy???



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.031 c
3-1095422021
Bless
2004-09-17 15:53
2004.10.17
Как лучше всего выйти из следующей ситуации:


3-1095595954
Muchacho
2004-09-19 16:12
2004.10.17
Unicode в Paradox


4-1095008025
Solo
2004-09-12 20:53
2004.10.17
Вызов функции из другого процесса


1-1096137981
debuger
2004-09-25 22:46
2004.10.17
Потоки и VCL


14-1096198154
begin...end
2004-09-26 15:29
2004.10.17
Windows 2000: хранить в холодильнике