Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.021 c
1-1096876615
cad2206
2004-10-04 11:56
2004.10.17
Сложение времени


1-1096646043
Homa_Programer
2004-10-01 19:54
2004.10.17
Перенос текста на новую страницу...


6-1092061764
Юрий Ж.
2004-08-09 18:29
2004.10.17
idTCPServer/idTCPClient


8-1090659762
DarkAvenger
2004-07-24 13:02
2004.10.17
тег mp3 файла


3-1095335493
analyser
2004-09-16 15:51
2004.10.17
Наследуемые формы и ADOCommand на форме-предке




   Наверх