Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GLScene: Удаление объекта после анимации.


kas-t ©   (2004-06-14 00:17:00) 

Не получается удалить объект. Дело в том, что нужно удалить объект 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 то все отлично удаляется.


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

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

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


kerby   (2004-06-15 11:25:00) [2]

Я делаю так
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;


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

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


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

Я вот как-то тоже с удалением объектов ковырялся... Удалял по таймеру. Тупо, конечно, по таймеру, но когда в сцене не более десятка объектов... Ну ладно, вот код; ошибок не было.
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-14 04:43:00) [5]

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

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


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

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


DeadMeat   (2004-06-14 01:41:00) [6]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо