Главная страница
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.034 c
1-1096529915
Pontic
2004-09-30 11:38
2004.10.17
MDI-форма в dll


1-1096889846
DelphiLexx
2004-10-04 15:37
2004.10.17
Для чего и как пользоваться оператором Inline


4-1095149940
akim2
2004-09-14 12:19
2004.10.17
Параметры запуска сервиса


1-1096485185
sdw_syscoder
2004-09-29 23:13
2004.10.17
Структура каталогов и файлов на диске


3-1095592312
KADAN
2004-09-19 15:11
2004.10.17
mssql => msaccess