Category Archives: AS3

getDefinitionNames

У класса ApplicationDomain есть замечательный метод getDefinitionByName, возвращающий нам класс нужного объекта или функцию. Но нет метода getDefinitionNames, возвращающий имена всех классов, находящихся в данном домене (или загруженном swf). Моя функция getDefinitionNames призвана устранить данный недостаток. Для получения имен классов необходимо передать объект LoaderInfo или ByteArray, содержащий корректный swf.

Исходники

Версия 2.1 от 09.03.10:

  • Теперь в обычный режим поиска возвращает только классы (ранее были ещё и интерфейсы).
  • Появилась поддержка Flash 10 (наконец-то :) ) и типа данных Vector. В расширенном режиме поиска классы типа Vector. (где X — имя класса) также будут перечислены.
  • Версия 2.0 от 16.09.09:

  • Новый режим extended, работающий по другому алгоритму (чуть-чуть медленнее обычного поиска). В этом режиме вы получите не только список классов и интерфейсов, а все доступные definitions, т. е. функции, пространства имен, константы, переменные и т. п.
  • Также появился режим onlyLinked (в этом случае не работает extended), при котором вы получите список только тех классов, которые указаны в качестве linkage в библиотеке swf. В том числе те, которые создаются при использовании метатега [Embed]. Такой режим существенно быстрее обычного и расширенного поиска и рекомендуется в тех случаях, когда вы загружаете библиотеку графических и звуковых ресурсов и вам нужен список только самих ресурсов.
  • Эта версия полностью совместима с предыдущими, при обновлении вам потребуется всего лишь обновить код getDefinitionNames
  • Версия 1.1.1 от 16.09.09:

  • Ещё раз исправлена ошибка поиска классов :)
  • Версия 1.1 от 13.09.09:

  • Исправлена ошибка, в результате которой второй и последующие кадры swf, содержащие код, не распознавались
  • В качестве аргумента в функцию можно передавать как LoaderInfo (как было в предыдущей версии), так и ByteArray, содержащий корректный swf
  • P. S.: Решение для тех, кто хочет знать о подгруженном swf больше.

    FontLoader — 2.3!

    Вышла новая версия FontLoader — 2.3!
    Напомню: FontLoader — инструмент, позволяющий вам загружать любые swf-ролики версии 6 и выше, так или иначе содержащие embedded-шрифты для дальнейшего их использования в вашем приложении. Теоретически, возможна загрузка роликов версии от 3 до 5, но на деле шрифты не регистрируются. С предыдущей версии FontLoader сильно изменился:

    • Полностью переписан код, исправлены ошибки в парсинге, уменьшен размер кода
    • Нет больше событий FONTS_NOT_FOUND, REGISTER, регистрация всех шрифтов происходит единовременно, а не по одному, как было раньше
    • Больше не поддерживаются шрифты статических полей
    • Используются только стандартые события flash.events.*, а значит работа с классом стала проще и нагляднее

    История:
    v. 2.3 (20.01.11): Добавлена поддержка CFF-шрифтов (тег DefineFont4), а также embedded-swf, т. е. вложенные swf в теге DefineBinaryData (метатегом Embed, например), также будут проанализированы на наличие шрифтов. Это, в частности, позволяет использовать стандартный RSL-прелоадер-контейнер для textLayout.swc из Flash CS5 при подготовке библиотеки со шрифтами. В демоверсии приложены варианты библиотек с внедренным textLayout.swc и с загружаемым как RSL.

    v. 2.2 (25.06.09): Добавлено событие VERIFY_ERROR, возникающее в случае, если загруженные данные имеют неверный формат;

    v. 2.1 (15.06.09): Теперь класс совместим с AIR. Также добавлен новый метод loadBytes, аналогичный по действию одноименному методу класса Loader.

    Посмотреть демо. Код класса можно получить там же.

    Напомню, что класс распространяется по лицензии CC-BY-ND.

    LoaderInfo Vulnerability Fixed?

    Похоже, нас услышали.
    В Flash 10 AS3 API обнаружилось изменение описания метода getLoaderInfoByDefinition класса LoaderInfo. Было:

    getLoaderInfoByDefinition () method

    public static function getLoaderInfoByDefinition(object:Object):LoaderInfo

    Returns the LoaderInfo object associated with a SWF file defined as an object.

    Player Version: Flash Player 9 Update 3.

    Parameters object:Object — The object for which you want to get an associated LoaderInfo object.

    Returns LoaderInfo — The associated LoaderInfo object. Returns null when called in non-debugger builds (or when debugging is not enabled) or if the referenced object does not have an associated LoaderInfo object (such as some objects used by the AIR runtime).

    Throws SecurityError — The caller is not running in the local trusted sandbox.

    Стало:

    getLoaderInfoByDefinition () method
    public static function getLoaderInfoByDefinition(object:Object):LoaderInfo

    Language Version : ActionScript 3.0
    Player Version : Flash Player 9.0.115.0

    Returns the LoaderInfo object associated with a SWF file defined as an object.

    Parameters
    object:Object — A SWF file object.

    Returns
    LoaderInfo — The associated LoaderInfo object.

    Т.е. теперь возвращается LoaderInfo того swf, который создал объект, переданный в аргументе метода. Таким образом, описанной мной дыры теперь нет.

    Проверить это сейчас у меня нет возможности, позже выясню этот вопрос.

    О дырах и багах

    Обнаружил интересный баг работы события ADDED_TO_STAGE:

    This content requires Adobe Flash Player.


    Сколько раз будет вызван обработчик addedToStage для sp0? Я всегда полагал, что один раз. Оказывается, он будет вызван три (!) раза. Это о багах.

    Теперь о дыре, обнаруженной BlooDHounD-ом вместе со мной. У класса LoaderInfo есть один интересный статический метод getLoaderInfoByDefinition, принимающий в качестве аргумента любой объект и возвращающий объект LoaderInfo. Дело в том, что LoaderInfo, который он возвращает, имеет ссылки на content (document class нашего приложения), а значит на stage и прочие объекты, доступ к которым, вообще говоря, должен быть ограничен. На лицо серьезная дыра, позволяющая обращаться к stage из любого объекта или класса, не говоря уже об ApplicationDomain, причем, независимо от того, в каком домене находится объект, вызывающий данный метод. Простой пример:

    This content requires Adobe Flash Player.


    Письмо о дыре будет отправлено в Adobe.

    Видеопособие по созданию прелоадера во Flash CS3

    Jarrod Medrano из Portent Interactive опубликовал в своем блоге видеопособие по созданию AS3-прелоадера во Flash CS3. Thanks, Jarrod! :-)

    Медленный инкремент II

    Возвращаясь к давней статье miramax-а «Медленный инкремент».
    На самом деле инкремент и декременты не медленные, дело в том, что примеры кода тестировались в среде Adobe Flash CS3, которая создает новые поля класса вместо локальных переменных. Т.е. на самом деле, инкремент медленный в случае uint-поля класса. Пример:

    This content requires Adobe Flash Player.

    Запустив класс, вы увидите, что инкременты примерно одинаковы по скорости. Если же раскомментировать строчку с полем класса и закомментировать локальную переменную, то разница в скорости будет очевидна.

    E4X Trick

    Вам никогда не требовалось, скажем, пронумеровать все узлы вашего XML определенным атрибутом? Использовать циклы и прочие громоздкие конструкции с рекурсией совершенно неинтересно.

    Попробуем средствами E4X. Например, есть у нас вот такой XML и итератор:

    This content requires Adobe Flash Player.

    Пробуем присвоить все атрибуты:

    This content requires Adobe Flash Player.

    Получаем ошибку «TypeError: Error #1089: Assignment to lists with more than one item is not supported.». Значит мы не можем присвоить атрибут более чем одному элементу. Пойдем с другой стороны:

    This content requires Adobe Flash Player.

    Получаем ошибку «TypeError: Error #1010: A term is undefined and has no properties.». Получается, что пока атрибут не будет существовать, мы не сможем присвоить значение.

    Хорошо, переделаем XML:

    This content requires Adobe Flash Player.

    Получаем то, что и требовалось:

    This content requires Adobe Flash Player.

    Определенно, нас такой подход не устраивает. Что ж, небольшой трюк:

    This content requires Adobe Flash Player.

    Проблема решена :)

    Обновление ClassExplorer

    Обновился ClassExplorer. Кто ещё не знает, ClassExplorer — класс, который позволяет загрузить ActionScript 3 swf-ку и получить интересную информацию о классах, находящихся в ней, у в удобном XML-формате, напоминающем формат вывода describeType.
    Из нового: изменен алгоритм поиска тегов, добавлен геттер data, который позволит вам использовать загруженную swf-ку для Loader-а, появились имена параметров методов (если они есть, конечно), название скрипта (definition name), типы отлавливаемых методом исключений. Класс практически полностью подвергся изменениям и должен работать довольно быстро. Подобные изменения, скорее всего, будут и у других моих классов на тему ковыряния в swf.

    Собственные абстрактные классы

    Скорее всего мало кому открою секрет создания абстрактных классов (классы, от которых можно наследоваться, но нельзя создавать экземпляры этого класса):

    This content requires Adobe Flash Player.

    или

    This content requires Adobe Flash Player.

    ClipFactory

    Мечтали создавать мувиклипы программным способом с заданным количеством кадров? Мечты сбываются.
    Класс ClipFactory позволит вам создавать обычный мувиклип с указанным количеством пустых кадров, который вы в последствии сможете использовать в качестве анимационного клипа, выполняя действия в каждом кадре (навесив обработчики через метод addFrameScript).

    Смотреть (пример с двумя созданными клипами, четырехкадровым и трехкадровым, выполняющих некоторую анимацию при проигрывании каждого своего кадра).

    з.Ы. Может кому и пригодится :D