Просмотр полной версии : Как лучше всего удалить MovieClip со сцены?
gloomyBrain
28.10.2010, 23:01
trace("hello world!") :victory:
Ситуация:
- есть куча классов с отрисованной анимацией
- каждый класс наследуется от MovieClip
- мувик нужно добавить на сцену, проиграть 1 раз и затем удалить
Как сделано сейчас:
- через Delegate создается анонимная функция, которая посредством addFrameScript вешается на последний кадр мувика
Вопрос:
Можно ли это сделать лучше и, если да, то как?
Заранее trace("thank you, folks") :drinks:
Ого, какой вопрос от вас (:
А почему именно через Delegate, а не сразу addFrameScript с анонимной функцией?
f.g.programmer
28.10.2010, 23:18
Лучше бросать в конце анимации событие сигнализирующее об окончании анимации. Это позволит одинаково работать с анимациями имеющими разные уровни вложенности (из глубины анимации можно бросить всплывающее событие)
Добавлено через 1 минуту
К тому же при этом не надо будет использовать недокументированные возможности флеша.
gloomyBrain
29.10.2010, 00:26
А почему именно через Delegate, а не сразу addFrameScript с анонимной функцией
Ну, мне показалось так удобнее. Есть в родителе функция, которая получает в параметр ребенка и удаляет его (то есть как раз анимацию). Через Delegate просто удобно создать анонимную функцию, которая вызывает функцию родителя с нужным параметром (надеюсь не все сломали глаза это читать =) )
Лучше бросать в конце анимации событие сигнализирующее об окончании анимации
Чем это лучше? тут 2 варианта:
1) лезть в каждую анимацию и писать ей скрипт в кадре (это epic fail)
2) эмм... а как еще? Я так понимаю, что только через addFrameScript. Только я не понимаю, что такое нужно в этот addFrameScript написать, чтобы заставить мувик отправить нужное событие и чтобы это не было анонимной функцией
f.g.programmer
29.10.2010, 01:01
1) лезть в каждую анимацию и писать ей скрипт в кадре (это epic fail)
Да, лезть придётся. Но для писания скрипта у меня, например, написан довольно простой jsfl скрипт, который делает это автоматически, так что никакого epic fail
Только я не понимаю, что такое нужно в этот addFrameScript написать, чтобы заставить мувик отправить нужное событие и чтобы это не было анонимной функцией
Это может быть бросание события :)
gloomyBrain
29.10.2010, 01:39
Бросание кем? В данном случае вариант с Delegate и прямым вызовом мне кажется более приемлемым. Насчет jsfl - круто это все до тех пор, пока Вам всегда нужно использовать графику в одном контексте. ИМО - fail =)
f.g.programmer
29.10.2010, 01:54
Бросание кем?
Да действительно, чтобы бросить событие придётся использовать делегирование или локальную функцию.
до тех пор, пока Вам всегда нужно использовать графику в одном контексте
Пусть есть у нас другой контекст, нужно бросить 3 события, в трёх точках анимации. Мы залезаем в анимацию, смотрим в каких кадрах нужно бросить событие, и добавляем в коде через addFrameScript.
Через некоторое время изменяем анимацию на несколько кадров, ищем в коде где к ней привязаны addFrameScript, и правим их. Так?
Добавлено через 3 минуты
Да, ещё нужно делать все анимации одноуровневыми или прописывать и помнить идентификаторы вложенных клипов (снова же лезть в каждую анимацию). Либо, для случая с удалением, находить самую длинную анимацию из вложенных, и считать её длину продолжительностью проигрывания.
gloomyBrain, открыл я доку от адоба и обнаружил, что единственное место в хэлпе по ас3, где упоминается делегирование тут (http://help.adobe.com/ru_RU/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e54.html), да и то больше в контексте, мол для программеров, которые не могут отвыкнуть от ас2 и, мол, так делать не хорошо.
Исходя из этого рекомендовал бы всю анимацию наследовать от некоего класса, в котором через addFrameScript на последний кадр вешалась бы функция, которая диспатчила команду наверх об удалении.
Что касается значительной вложенности - это ИМХО частный случай, требующий другого, индивидуального, подхода.
ЗЫ. если есть другие варианты - тоже было бы интересно...
f.g.programmer
29.10.2010, 09:11
Что касается значительной вложенности - это ИМХО частный случай
Для меня (сам я почти не рисую) это обычный случай. Достаточно двух уровней вложенности (анимация состоит из нескольких простых анимированных клипов), чтобы addFrameScript стал неудобен или вовсе неприменим.
Вот кстати с утра подумалось об общем классе и деспатче события яЗакончилПроигрываться. Это универсальный способ, ибо можно поставить счетчик, по истечению которого можно удалить всех, кто поместился в вектор-пул. Это как пример полезности)
gloomyBrain
29.10.2010, 12:15
наследовать от некоего класса, в котором через addFrameScript на последний кадр вешалась бы функция
Вот кстати с утра подумалось об общем классе и деспатче события яЗакончилПроигрываться
Мне показалось, или Вы только что предложили мне создать 84 .as файла? =)
ЗЫ
по ходу нет ничего проще Delegate в данном случае. Да поможет мне GC =)
зачем 84?
пусть все ваши клипы наследуются от одного кастомного класса, расширяющего MovieClip, в котором можно реализовать нужный функционал... нет?
Во-во, от одного и нужно. Если у них разная длина таймлайна, можно передавать число кадров в конструктор этого класса.
arkadattx
29.10.2010, 12:52
КорДум, зачем передавать, если есть totalFrames?
я в подобном случае в этом суперклассе просто добавлял слушателя ENTER_FRAME...
ну и проверял currentFrame и totalFrames
А, действительно, я не использовал это со времен AS1/2.
Psycho Tiger
29.10.2010, 13:04
Если честно я слегка ошарашен. Я думал Delegate вообще не существует в AS3 как явления.
Глум, я не очень понял чем тебе не подходит addFrameScript ?
P.S. где можно найти инфу о Delegate в AS3? Везде пишут что он встроенный в язык и скрыт от пользователя.
то что это недокументированный метод не смущает?
arkadattx
29.10.2010, 13:11
derhab, а чем это плохо?
То что в какой-то момент перестанет работать? Сомневаюсь. Скорее сделают документированным.
Psycho Tiger
29.10.2010, 13:25
то что это недокументированный метод не смущает?
Ну и опкоды для работы с памятью не документированы, но ничего, энтузиасты продолжают заставлять бегать скрипты в 5-10 раз быстрее )
gloomyBrain
29.10.2010, 14:08
package {
public class Delegate {
public static function create(handler:Function, ...args):Function {
return function(...innerArgs):void {
handler.apply(this,innerArgs.concat(args));
}
}
}
}
Соответственно, клипу вешается вот такая конструкция
clip.addFrameScript(clip.framesTotal - 1, Delegate.create(removeClip, clip));
Где removeClip - это функция контейнера, в которую приходит клип для удаления
Про наследование - я создаю AS файл и пишу в нем нужный функционал. Далее мне нужно для всех символов библиотеки указать его как класс, от которого надо унаследоваться...
Ага, спасибо разобрался =) В CS3 почему-то не получалось указать baseClass без написанного ручками linkageClass (может, лицензию надо поставить?)
Сори за потраченное время =/
Psycho Tiger
29.10.2010, 14:37
А, понятно. Не думал, что это Delegate`ом называется, спасибо. )
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.