
Растеризация вектора в Flash с использованием JSFL
Введение
Наверняка многие из вас сталкивались с проблемой производительности среды Flash при отрисовке больших уровней в векторе. Это случается к примеру, если вы решили создать достаточно детализированную текстуру ландшафта и заполнить ею весь уровень. В этих случаях очень полезно растеризовать векторную графику. К сожалению, Flash не предоставляет удобных средств для этого — приходится экспортировать вектор в PNG, а затем импортировать PNG обратно. Это, конечно же, не удобно. К счастью, среда предоставляет удобный механизм для расширения своих возможностей — это JSFL. Но, несмотря на исключительную полезность этого функционала, в интернете сложно найти какие-либо готовые скрипты на эту тему, поэтому я решил, что будет полезнее не продолжать поиски, а реализовать этот механизм самому, заодно еще немного расширив кругозор.О скрипте
Скрипт позволяет создать растеризованную копию одного или нескольких символов, выбранных в библиотеке. Запустить скрипт можно из пункта «Команды» главного меню:
Появится форма диалога, в которой можно указать опции: дополнительный отступ (полезно для клипов с эффектами, которые выходят за рамку выделения) и необходимость создания клипа-обертки над растровым изображением. Клип-обертка может оказаться полезной в некоторых случаях, в частности для корректировки позиции растрового изображения.

Новые объекты будут расположены в той же папке, что и исходный объект. Итоговый результат будет выглядеть примерно так:

В этой статье я не буду вдаваться в подробности написания скрипта на JSFL, — если кому интересно, можете скачать и поизучать исходники в конце статьи, — я специально вставил побольше комментариев, чтобы происходящее там было максимально понятно. Вкрадце механизм таков:
1) Создаем в памяти новый документ и привязываем к нему специально созданный профиль, учитывающий размеры выбранного символа и включающий опцию экспорта в PNG.
2) Копируем выбранный символ в новый документ и смещаем так чтобы он полностью влезал в кадр.
3) Публикуем, получаем PNG-файл и закрываем созданный документ.
4) Импортируем полученный PNG-файл и помещаем его в ту же папку в библиотеке, что и исходный символ.
5) Создаем обертку над растром.
Ограничения:
• Если клип содержит эффекты, выходящие за пределы самого клипа, размеры определяются неправильно. В этом случае следует вручную задать смещение.
• Если клип содержит линии, то они также как и эффекты не учитываются при определении размера. Поступаем так же, как в предыдущем пункте.
Вкрадце о JSFL
Поскольку тема JSFL в блогах упоминалась лишь вскользь, вкрадце опишу, что это вобще такое.JSFL — это на самом деле обыкновенный JavaScript файл. Среда Flash предоставляет набор классов и методов, при помощи которого можно управлять как самой средой (открывать и создавать документы, переключаться между ними), так и привычными для любого пользователя Flash объектами (символами в библиотеке, кадрами, слоями и т.п.). Еще имеются средства для работы с файлами и механизм для создания и использования собственных диалогов (о нем почитать можно тут).
Официальная документация конечно не идеальная, но она есть: 1) сводка по механизму в целом, 2) документация по всем классам.
Исходники
- Скрипт
- Форма
C:/Users/<имя пользователя>/AppData/Local/Adobe/Flash CS5/ru_RU/Configuration/Commands/ (для Windows 7)
- +9
- xewelus
Комментарии (12)
Смотри, а то кто нибудь из новичков возьмёт, да и сделает так, свф будет весить 100 мегабайт )
Умножь на 10, полтора метра прибавится, флешке это ни к чему…
Ты действительно пользуешься пнг? Не ну этот пост про рисование же, чтоб флэшIDE не тормозило, если я правильно понял.
В финальной сборке лучше рендерить через код, в уже запущеной swf.
Под портальные флэшки пойдет генерация битмапов в рантайме.
минусы твоего метода:
— много возни, если захочется подредактировать символ
— увеличивается размер флешки
Насчет минусов — не спорю, они есть, но иногда это очень спасает. Например если покрыть уровень размером 1200x1200 пикселей векторной растительностью, то никакого процессора и ОЗУ не хватит.
Да и возни не так уж и много — подредактировать исходный символ, растеризовать его, а дальше «Поиск и замена».
Кстате, если так уж заботит размер флешки, то в перед релизом можно тем же способом заменить растр обратно на вектор.