Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   удаление со сцены нужного клипа (http://www.flasher.ru/forum/showthread.php?t=185567)

In8Finity 15.10.2012 16:25

удаление со сцены нужного клипа
 
Подскажите, как быть.
Ситуация у меня такая.
Сначала я добавляю на сцену клип "boom1".
В этом клипе идёт анимация и когда он заканчивается я хочу его удалить со сцены.

Код AS3:

boom1 = new Boom(); 
addChild(boom1);
addEventListener(Event.ENTER_FRAME, checkboom1);

Функция удаления у меня такая вот:

Код AS3:

private function checkboom1(evt:Event):void 
{
        if (boom1.currentFrame == boom1.totalFrames)
                {
                  removeChild(boom1);
                  removeEventListener(Event.ENTER_FRAME, checkboom1);
                }
}

Это всё работает хорошо до тех пор пока у меня на сцене один только клип boom1.
А если их добавляется два - то удаляется в итоге только тот, который был добавлен последним.
А у тех клипов boom1, которые добавлены не последними - анимация продолжает проигрываться по кругу и они не удаляются.

Как сделать так, чтобы моя функция отвечала только за определённый boom1 и удаляла именно его?

in4core 15.10.2012 16:31

Пока непонятно как оно работает. Покажите код где используется 2 и более бумов. из него и будем решать

AlexLucas 15.10.2012 16:38

Вы добавляете слушатель к родителю бума, на который вы его и выкладываете.
Код AS3:

addEventListener(Event.ENTER_FRAME, checkboom1);

Напишите один класс для всех бумов, прицепите слушатель там, и там делайте проверку.
И в классе к которому вы добавляете бумы просто
Код AS3:

addChild(new Boom());


silin 15.10.2012 16:48

можно подписывать на ENTER_FRAME не контейнер, а самих бумов, ну и проверять/удалять соответственно экземпляры, от которых пришло событие
Код AS3:

boom1 = new Boom();
addChild(boom1);
boom1.addEventListener(Event.ENTER_FRAME, checkboom);

Код AS3:

private function checkboom(e:Event):void
{
        var boom:Boom = e.target as Boom;
        if (boom.currentFrame == boom.totalFrames)
        {
                removeChild(boom);
                boom.removeEventListener(Event.ENTER_FRAME, checkboom1);
        }
}


in4core 15.10.2012 17:06

Цитата:

ожно подписывать на ENTER_FRAME не контейнер, а самих бумов
А если их тысячи, то по рамкам оптимизации делается 1 событие, а не 1000

silin 15.10.2012 17:12

>>А если их тысячи, то по рамкам оптимизации делается 1 событие, а не 1000
по разному делается Ж), я ж написал можно
добавили какие-то шняги, которые отыграли и сгинули, да хоть бы и тысячи, так ли надо это оптимизировать?

In8Finity 15.10.2012 17:31

silin: Спасибо. То, что надо. Для моих целей как раз подходит.

gloomyBrain 15.10.2012 18:00

Цитата:

можно подписывать на 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
Код писал прямо тут, прошу прощения если есть ошибки.

caseyryan 15.10.2012 18:05

Цитата:

Код писал прямо тут, прошу прощения если есть ошибки.
Ошибка есть тут:
Код AS3:

public function execute():void {
        var len:int = _targets.length;
        while (len--) {
            _container.removeChild(_targets[i]); // вместо i - len
        }
    }


In8Finity 15.10.2012 18:36

Ничегосебе вы в лес забрались.
Мне даже как-то неудобно дальше спрашивать.
Но всё-же...
Ещё один глупый вопрос.
Если взглянуть на код silin.

Вот в первой части у меня может быть не просто
Код AS3:

boom1 = new Boom();

а в зависимости от условий, например, так:

Код AS3:

if (tempFlag == 1) { boom1 = new smallBoom(); }
else
if (tempFlag == 2) { boom1 = new bigBoom(); }

воот...
и теперь как мне изменить строку
Код AS3:

var boom:Boom = evt.target as Boom;

так, чтобы подставлялись нужные бумы?
попробовал так, но, конечно, неправильный синтаксис:
Код AS3:

if (boom1 == smallBoom()) boom:smallBoom = evt.target as smallBoom;
if (boom1 == bigBoom()) boom:bigBoom= evt.target as bigBoom;



Часовой пояс GMT +4, время: 14:35.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.