Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.10.2012, 16:25
In8Finity вне форума Посмотреть профиль Отправить личное сообщение для In8Finity Найти все сообщения от In8Finity
  № 1  
Ответить с цитированием
In8Finity

Регистрация: Jan 2010
Сообщений: 187
Question удаление со сцены нужного клипа

Подскажите, как быть.
Ситуация у меня такая.
Сначала я добавляю на сцену клип "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 и удаляла именно его?

Старый 15.10.2012, 16:31
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Пока непонятно как оно работает. Покажите код где используется 2 и более бумов. из него и будем решать
__________________
Марк Tween

Старый 15.10.2012, 16:38
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 3  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
Вы добавляете слушатель к родителю бума, на который вы его и выкладываете.
Код AS3:
addEventListener(Event.ENTER_FRAME, checkboom1);
Напишите один класс для всех бумов, прицепите слушатель там, и там делайте проверку.
И в классе к которому вы добавляете бумы просто
Код AS3:
addChild(new Boom());

Старый 15.10.2012, 16:48
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
можно подписывать на 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);
	}
}

Старый 15.10.2012, 17:06
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
ожно подписывать на ENTER_FRAME не контейнер, а самих бумов
А если их тысячи, то по рамкам оптимизации делается 1 событие, а не 1000
__________________
Марк Tween

Старый 15.10.2012, 17:12
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>А если их тысячи, то по рамкам оптимизации делается 1 событие, а не 1000
по разному делается Ж), я ж написал можно
добавили какие-то шняги, которые отыграли и сгинули, да хоть бы и тысячи, так ли надо это оптимизировать?

Старый 15.10.2012, 17:31
In8Finity вне форума Посмотреть профиль Отправить личное сообщение для In8Finity Найти все сообщения от In8Finity
  № 7  
Ответить с цитированием
In8Finity

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

Старый 15.10.2012, 18:00
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 8  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
можно подписывать на 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
Код писал прямо тут, прошу прощения если есть ошибки.
__________________
...вселенская грусть

Старый 15.10.2012, 18:05
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Код писал прямо тут, прошу прощения если есть ошибки.
Ошибка есть тут:
Код AS3:
public function execute():void {
        var len:int = _targets.length;
        while (len--) {
            _container.removeChild(_targets[i]); // вместо i - len
        }
    }

Старый 15.10.2012, 18:36
In8Finity вне форума Посмотреть профиль Отправить личное сообщение для In8Finity Найти все сообщения от In8Finity
  № 10  
Ответить с цитированием
In8Finity

Регистрация: Jan 2010
Сообщений: 187
Ничегосебе вы в лес забрались.
Мне даже как-то неудобно дальше спрашивать.
Но всё-же...
Ещё один глупый вопрос.
Если взглянуть на код 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, время: 21:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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