Форум: "Игры";
Текущий архив: 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