Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.043 c
1-1096535034
BorH
2004-09-30 13:03
2004.10.17
Конвертация String[4] в Integer


4-1095100166
MIGUR
2004-09-13 22:29
2004.10.17
Изменения параметров в BOIS


10-1049440442
Mike
2003-04-04 11:14
2004.10.17
HTTP Proxy


1-1096619466
Sash
2004-10-01 12:31
2004.10.17
главная форма ровно по центру монитора


14-1095965277
lipskiy
2004-09-23 22:47
2004.10.17
Существуют ли электронные карты (местности) в виде





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский