Растеризация вектора в 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

Комментарии (12)

0
Полезный пост, спасибо!
0
жалко что можно только один кадр из мувика отрендерить
+3
К сожалению, Flash не предоставляет удобных средств для этого — приходится экспортировать вектор в PNG, а затем импортировать PNG обратно. Это, конечно же, не удобно.
CS 5.5 умеет: modify -> convert to bitmap — и ложит пиксель в пиксель
  • osa
  • osa
0
настроечек нет же, а так да.
0
эх, не знал. Просто у меня cs5.
0
Это для рисования чтоли?
Смотри, а то кто нибудь из новичков возьмёт, да и сделает так, свф будет весить 100 мегабайт )
0
Откуда такие цифры? :)
0
Ну у меня пнг с фоном игры весит в среднем 150кб
Умножь на 10, полтора метра прибавится, флешке это ни к чему…
Ты действительно пользуешься пнг? Не ну этот пост про рисование же, чтоб флэшIDE не тормозило, если я правильно понял.
В финальной сборке лучше рендерить через код, в уже запущеной swf.
+1
Да, пользуюсь для текстур и для часто встречающихся элементов с большим количеством вектора. Целиком фон конечно же лучше не растеризовать — в этом обычно не бывает надобности. Хотя с другой стороны сейчас полно флешек сделанных целиком в растре — к этому помоему все уже привыкли. Вобщем любым инструментом нужно пользоваться с умом.
0
Может быть полезно тем, кто под мобильные платформы делает. Ну или для публикации иллюстраций — родной экспорт у цс5 коряв. Хотя там скорее потребуется метод, описанный Elmortem с атласом — т.к. как правило от флэша требуется анимация.
Под портальные флэшки пойдет генерация битмапов в рантайме.
0
лучше ОЗУ докупить, а растеризовать в рантайме

минусы твоего метода:
— много возни, если захочется подредактировать символ
— увеличивается размер флешки
  • qdrj
  • qdrj
0
Насчет купить ОЗУ — тут дело ведь не в нем, т.к. узким местом является сам процессор.
Насчет минусов — не спорю, они есть, но иногда это очень спасает. Например если покрыть уровень размером 1200x1200 пикселей векторной растительностью, то никакого процессора и ОЗУ не хватит.
Да и возни не так уж и много — подредактировать исходный символ, растеризовать его, а дальше «Поиск и замена».
Кстате, если так уж заботит размер флешки, то в перед релизом можно тем же способом заменить растр обратно на вектор.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.