![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jan 2010
Сообщений: 187
|
Подскажите, как быть.
Ситуация у меня такая. Сначала я добавляю на сцену клип "boom1". В этом клипе идёт анимация и когда он заканчивается я хочу его удалить со сцены. Функция удаления у меня такая вот: private function checkboom1(evt:Event):void { if (boom1.currentFrame == boom1.totalFrames) { removeChild(boom1); removeEventListener(Event.ENTER_FRAME, checkboom1); } } А если их добавляется два - то удаляется в итоге только тот, который был добавлен последним. А у тех клипов boom1, которые добавлены не последними - анимация продолжает проигрываться по кругу и они не удаляются. Как сделать так, чтобы моя функция отвечала только за определённый boom1 и удаляла именно его? |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 431
|
Вы добавляете слушатель к родителю бума, на который вы его и выкладываете.
Напишите один класс для всех бумов, прицепите слушатель там, и там делайте проверку. И в классе к которому вы добавляете бумы просто |
|
|||||
|
можно подписывать на ENTER_FRAME не контейнер, а самих бумов, ну и проверять/удалять соответственно экземпляры, от которых пришло событие
|
|
|||||
|
>>А если их тысячи, то по рамкам оптимизации делается 1 событие, а не 1000
по разному делается Ж), я ж написал можно добавили какие-то шняги, которые отыграли и сгинули, да хоть бы и тысячи, так ли надо это оптимизировать? |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 187
|
silin: Спасибо. То, что надо. Для моих целей как раз подходит.
|
|
|||||
|
Цитата:
Я бы наоборот делал. Смотрите, нам же известно сколько кадров у бума? Причем известно прямо в момент добавления. То есть то что нам нужно сделать - это запланировать удаление через некоторое число кадров. Давайте начнем с задания: public class RemoveTask { private var _container:DisplayObjectContainer; private var _targets:Vector.<DisplayObject>; public function RemoveTask(container:DisplayObjectContainer){ super(); _container = container; _targets = new Vector.<DisplayObject>(); } public function addTarget(target:DisplayObject):void { _targets.push(target); } public function execute():void { var len:int = _targets.length; while (len--) { _container.removeChild(_targets[i]); } } } Теперь мы можем все объекты, которые были добавлены на этом кадре, добавлять в одно задание. А когда придет время - запускать задание и удалять всех, кто был добавлен N кадров назад. Давайте создадим очередь заданий: public class RemoveQueue { private var _container:DisplayObjectContainer; private var _interval:uint; private var _dispatcher:Shape; private var _currenFrameTask:RemoveTask; private var _tasks:Vector.<RemoveTask>; public function removeQueue(container:DisplayObjectContainer, interval:uint) { super(); _interval = interval; _conrainer = container; _tasks = new Vector.<RemoveTask>(_container); _currentFrameTask = new RemoveTask(); _tasks.push(_curentFrametask); _dispatcher = new Shape(); _dispatcher.addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void { _currentFrameTask = new RemoveTask(_container); _tasks.push(_currentFrameTask); while (_tasks.length > _interval) { var task:RemoveTask = _tasks.shift(); task.execute(); } } public function addTarget(target:DisplayObject):void { _currentFrameTask.addTarget(target); } } PS Код писал прямо тут, прошу прощения если есть ошибки.
__________________
...вселенская грусть |
|
|||||
|
Цитата:
|
|
|||||
|
Регистрация: Jan 2010
Сообщений: 187
|
Ничегосебе вы в лес забрались.
Мне даже как-то неудобно дальше спрашивать. Но всё-же... Ещё один глупый вопрос. Если взглянуть на код silin. Вот в первой части у меня может быть не просто а в зависимости от условий, например, так: if (tempFlag == 1) { boom1 = new smallBoom(); } else if (tempFlag == 2) { boom1 = new bigBoom(); } и теперь как мне изменить строку так, чтобы подставлялись нужные бумы? попробовал так, но, конечно, неправильный синтаксис: |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:02. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|