Цитата:
|
можно подписывать на ENTER_FRAME не контейнер, а самих бумов, ну и проверять/удалять соответственно экземпляры, от которых пришло событие
|
Не, Макс, при большом количестве экземпляров это даст дополнительную нагрузку. Совсем не круто.
Я бы наоборот делал. Смотрите, нам же известно сколько кадров у бума? Причем известно прямо в момент добавления. То есть то что нам нужно сделать - это запланировать удаление через некоторое число кадров. Давайте начнем с задания:

Код AS3:
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]);
}
}
}
Вот такое задание - в него можно добавлять любое количество объектов (в нашем случае Бумов), которые будут удалены из контейнера при вызове метода execute.
Теперь мы можем все объекты, которые были добавлены на этом кадре, добавлять в одно задание. А когда придет время - запускать задание и удалять всех, кто был добавлен N кадров назад. Давайте создадим очередь заданий:

Код AS3:
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);
}
}
Теперь у нас есть полноценная очередь, которая с заданным интервалом (в кадрах) будет запускать задания на удаление Бумов. В каждом кадре создается новое задание, пока кадр не закончился все бумы будут складываться в него. То есть всего навсего - вызываем у очеред метод addTarget, и через заданный интервал наш бум будет удален из контейнера.
PS
Код писал прямо тут, прошу прощения если есть ошибки.