Экспорт классов во второй кадр и создание прелоадера во Flash CS3

Итак, в AS2 общая схема создания ролика all-in-one (с прелоадером) такова:
1) Все экспортируемые элементы не экспортируются в первый кадр (галочка Export in first frame снята);
2) Создается пустой мувик, содержащий два кадра. В первом только stop(); и больше ничего нет. Во втором кадре данного мувика размещаются все экспортируемые элементы (звуки, шрифты, мувиклипы). stop в первом кадре не позволяет данному мувику переходить на свой второй кадр, таким образом мы избегаем ненужной инициализации элементов, находящихся во втором кадре;
3) Данный мувик размещается во втором кадре проекта в любом месте сцены (все равно он в принципе невидим, т.к. в его первом кадре ничего нет);
4) В настроках AS2 проекта выставляется второй кадр для экспортирования классов;
5) В третьем (можно и во втором) кадре проекта можно пользоваться всеми классами и ресурсами.

Таким образом, первый кадр освобожден от различных ресурсов и мы можем написать там обычный AS1-код (увы, чистого AS2 в таком варианте добиться вы получиться) прелоадера.

Однако, применяя такую схему для AS3, вы можете столкнуться с тем, что клипы, у которых есть содержимое, создаются, но это содержимое отсутствует. Такая проблема возникает для различных спрайтов, мувиклипов, которые содержат, например, шейпы, нарисованные вручную в IDE. В случае же обычных классов, не являющихся визуальными (или происходит программная отрисовка) такой проблемы нет. Проблема, судя по всему, связана с тем, что компилятор, когда встречает обращение к подобным клипам до кадра экспорта (в данном случае — второго), переносит код такого класса в первый кадр, а вот его содержимое (шейпы, например) — «забывает».

Что нам нужно для того, чтобы решить данную проблему?

Отказаться от обращений к пользовательским классам в Document class.

Как?

Использовать метод loaderInfo.applicationDomain.getDefinition для создания экземпляра класса, который будет являться входной точкой нашего приложения. А уже в этом классе мы можем создавать все, что душе угодно. Но при этом нам нужно добиться, чтобы класс, являющийся входной точкой нашего приложения был экспортирован во второй кадр.

А как этого можно добиться, если мы не делаем прямых обращений к пользовательским классам в Document class?

Заставить компилятор экспортировать наш входной класс также просто: необходимо создать пустой мувиклип, с прописанным у него входным классом и поместить этот клип в тот самый двухкадровый мувиклип-экспортер, содержащий и все остальные ресурсы. Таким образом, компилятор создаст два объявления AS3-классов в нашем ролике. В первом объявлении будет содержаться только Document class (вы можете, конечно, создать какие-либо невизуальные классы, либо классы-спрайты, занимающиеся программной отрисовкой чего-либо, но таким образом вы основательно можете увеличить вес первого кадра), во втором (которое располагается во втором кадре) — все остальные классы, в т.ч. класс, являющийся входной точкой.

Представляю вашему вниманию простейший пример создания ролика в CS3 с экспортом классов во втором кадре и загрузчиком.

Некоторые пояснения к примеру:
Классы Box и Star — нарисованные вручную клипы.

Класс Program есть по сути Document class, он же входная точка.

Класс AnotherClass просто иллюстрирует работу экспорта во второй кадр всех нужных классов (не только физически размещенных во втором кадре).

Класс EmbedClip является сервисным классом-экспортером, во втором кадре которого мы будем размещать все наши нарисованные клипы. В этот кадр данный класс никогда не переходит, во избежание лишних инициализаций классов. Экземпляр данного класса находится во втором кадре нашего ролика.

Ну а ExportSecondFrameExample есть настоящий Document class, по совместительству выполняющий функцию загрузчика.

64 Responses to Экспорт классов во второй кадр и создание прелоадера во Flash CS3

  1. вот посмотрите fla, пожалуйста (библиотеку почистила, чтоб полегче был)
    http://ifolder.ru/25202941

  2. В архиве не оказалось, собственно, кода класса MainTelros, равно как и ExportSecondFrameExample, это первое. Во вторых, embedClip был расположен в первом кадре сцены, а должен был во втором.

  3. спасибо Вам большое! действительно дело в embedClip все. надо же, куда я смотрела…. ворона )))
    и спасибо за код!

  4. gamerfan78

    Добрый день, Денис!
    Замечательная статья. Но возник вопрос, у меня есть игра с немного нестандартной структурой, сейчас стою на этапе создания прелоадера, испробовал этот метод и метод только с FlashDevelop без IDE с выставлением директивы -frame в компиляторе. Выдает ошибки, которые не появляются когда компилирую одну игру без прелоадера. Бьюсь уже второй день. Не могли бы вы посмотреть исходники? (З.Ы. Куда можно отправить их вам, если вы не против, т.к. не хотелось выставлять на всеобщее обозрение, как никак есть свои наработки :) )
    Премного благодарен!

  5. Почта в контактной информации

  6. gamerfan78

    Так, вроде бы разобрался на более ранней версии своей игры, когда не было кучи файлов. Ваш метод работает. Спасибо большое, буду пытаться разобраться с последней версией игрушки

  7. gamerfan78

    Денис, а что лучше делать в случае со звуками и музыкой? Кадру ведь назначается лишь один музыкальный файл

  8. Несколько слоев в отдельном мувике, например.

  9. gamerfan78

    Точно ведь! Еще раз огромное спасибо

  10. gamerfan78

    Денис, еще возник вопрос конкретно по Flash IDE (надеюсь, не надоел вам еще :) ) Существует ли какой-нибудь способ по анчекингу галочек сразу со всех объектов библиотеки в графе с пункта “Export in first frame”. Просто когда начинал создавать игру, прелоадер- это было последнее о чем я думал и галки стояли при создании клипов по-умолчанию. А теперь в проекте накопилось под сотню объектов в библиотеке. Снимать галочку с каждого будет просто мукой.

  11. Выбрать все нужные мувики, открыть Properties.

  12. gamerfan78

    Но пункт Properties становится не активным в таком случае (у меня CS3)

  13. Пора перейти на что-нибудь посвежее :)
    Либо писать JSFL-скрипт, хотя такой наверняка валяется где-нибудь

  14. gamerfan78

    Да, это верно :) . Тоже смотрел в крайнем случае в сторону JSFL. У меня просто все флеши после CS3 тормозят страшно. Кажется подобное по JSFL вот http://www.kirupa.com/forum/showthread.php?271614-JSFL-Export-movieclip-for-AS-and-not-in-First-frame-JSFL-reference

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>