Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Web-дизайн 1 часть / Литература / ActionScript 2.0. Программирование во Flash MX 2004.pdf
Скачиваний:
354
Добавлен:
26.03.2015
Размер:
8.81 Mб
Скачать

o pattern — шаблон имени переменной. Задается по схеме «*_suff>>, где suff^— указывающий на класс суффикс. Например, чтобы инициализировать суффикс «mov», следует набрать

pattern="*_mov"

o object — в данном атрибуте указывается, к какому классу относится переменная, удовлетворяющая прописанному в атрибуте pattern шаблону.

Например:

<"typeinfo pattern="*_xmlsocket" object="XMLSocket"/>

Тег <typeinfo> дает возможность инициализировать не только суффиксы, но и префиксы:

<typeinfo pattern"_level*" object="MovieClip"/>

На практике суффиксы быстрого завершения кода играли заметную роль только во Flash MX. Во Flash MX 2004 вместо них техничнее использовать строгую типизацию. Тем не менее, вы можете редактировать документ AsCodeHints.xml, если хотите заменить принятые по умолчанию суффиксы или ввести суффиксы для собственных классов. Например, чтобы меню с элементами класса Cat появлялось тогда, когда имя переменной завершается суффиксом «_cat», необходимо добавить в AsCodeHints.xml следующий тег:

<typeinfo pattern="*_cat" object="Cat"/>

Сохраните измененный документ и перезапустите Flash. Затем попробуйте набрать любой идентификатор с суффиксом «cat». После того как вы введете оператор «.», около него появится необходимое меню (рис. 16.14).

Рис. 16.14. Режим автоматического завершения кода в случае пользовательского класса

Не стоит бояться изменять документы ActionsPanel.xml, AsCodeHints.xml и AsColorSyntax.xml.

Даже если вы безнадежно испортите один из них, то переустанавливать Flash не придется. Просто удалите соответствующий файл из папки ActionsPanel и перезапустите программу. Flash автоматически его восстановит а принятом по умолчанию виде.

Редактируя отвечающие за настройки панели Actions ХМL-документы, вы можете не только инициализировать собственные классы. При этом можно включить в дерево языка полезные недокументированные элементы ActionScript (а также активизировать для них выделение цветом и ввести суффиксы автоматического завершения кода). Так, автор данной книги создал специальную ветвь для хранения недокументированных объектов вроде функции ASSetPropFlags() или объекта ASBroadcaster, назвав ее undocumented. Попробуйте и вы оптимизировать панель Actions «под себя». Затраченное на это время быстро окупится повышением удобства работы.

16.6.2. Объект CustomActions

Разработчики из Macromedia не рекомендуют напрямую редактировать документы

ActionsPanel.xml, AsCodeHints.xml и AsColorSyntax.xml. Во-первых, при этом можно внести ошибку, которая полностью блокирует нормальную работу панели Actions. Во-вторых, данные документы не так уж просто найти (их расположен ие зависит от операционной системы). В-третьих,

удалить введенные когда-то теги будет довольно сложно ввиду большого размера документа ActionsPanel.xml. Для перенастройки панели Actions техничнее использовать особый объект

ActionScript CustomActions.

Он предназначен для того, чтобы ХМL-документы с описанием инициализируемых элементов можно было помешать в папку ActionsPanel директории Configuration (и удалять их оттуда) непосредственно из среды разработки Flash.

Принципы использования объекта CustomActions мы изучим на конкретном примере. Попробуем создать в дереве языка панели Actions новую ветвь «undocumented», в которой будут храниться недокументированные элементы. В папку Functions этой ветви поместим функцию ASSetPropFlags(). Эту функцию также сделаем выделяемой цветом. Чтобы решить все эти задачи, нужно выполнить действия, описанные ниже.

1.Предопределенные элементы ActionScript инициализируются при помощи трех XMLдокументов, которые мы подробно разобрали в прошлом пункте. При инициализации пользовательских элементов с использованием объекта CustomActions нужно создать один XMLдокумент, который как бы объединяет в себе документы ActionsPanel.xml, AsCodeHints.xml и AsColorSyntax.xml. Этот документ образуется корневым тегом

<customactions>...</customactions> и тремя вложенными тегами: <actionspanel> ...

</actionspanel>, <colorsyntax>...</colorsyntax> и <codehints>...</codehints>. Данные вложенные теги идентичны корневым тегам соответствующих документов. Следовательно, и содержимое их задается точно так же:

<customactions>

<!--Создаем ветвь undocumented, помешаем в нее папку Global Functions с функци-

ей ASSetPropFlags--> <actionspanel>

<folder name="undocumented" id="und" version= "6" tiptext="Недокументированные элементы ">

<folder name="Global functions" id="undf" version="6" tiptext="Недокументированные функции ">

<action name="ASSetPropFlags" tiptext="Изменяет атрибуты свойств" text="ASSetPropFlags(%object,properties,flag1,flag2 %);"/>

</folder>

</folder>

</actionspanel> <!--Активизируем выделение цветом-->

<colorsyntax>

<identifier text="ASSetPropFlags"/> </colorsyntax>

</customactions>

У документа <customactions> есть и четвертый вложенный тег — <ifedition>...</ifedition>. Он ис-

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

2.Текст XML-документа можно набрать и непосредственно на панели Actions в виде строки. Но проще сохранить его во внешнем текстовом файле. Наберите приведенный выше код в любом текстовом редакторе, а затем сохраните его на рабочем столе как undocumented.xml. Так как среда разработки Flash работает с текстом в формате Unicode, в качестве кодировки создаваемого файла следует выбрать UTF-8. При этом можно, например, сделать подсказки или названия ветвей русскоязычными.

3.Создайте новый FLA-файл и сохраните его на рабочем столе. Затем на его первый кадр «повесьте» следующий код:

var inst:XML=new XML(); inst.load("undocumented.xml"); inst.onLoad=function():Void {

CustomActions.install("undocum",inst.toString());

}

Смысл данного кода довольно прозрачный. Создается объект класса ХМL, импортирующий посредством метода load() документ undocumented.xml. Когда текст документа поступает в фильм (при этом срабатывает событие onLoad), он под именем undocum.xml заносится в специальную папку CustomActions директории ActionsPanel. Выполняет эту операцию метод

CustomActions.install(name, text), где name — имя, под которым XML-файл будет создан в папке

CustomActions, text — текст документа инициализации. Если файл успешно записывается, то метод install() возвращает true. При сбое (его наиболее вероятная причина в том, что в имени файла был использован недопустимый символ вроде «\» или «:») результатом будет false. Если ХМ L- файл с именем name уже существует, то он будет перезаписан.

4.Нажав Ctrl + Enter, войдите в режим тестирования. Если компилятор не выдаст ошибок, значит, все было сделано верно. Вернитесь в среду разработки и посмотрите, что изменилось на панели Actions. В дереве языка слева должна появиться новая ветвь undocumented (рис. 16.15).

Puc. 16.15. Ветвь недокументированных возможностей

5.Откройте папку CustomActions папки ActionsPanel. Вы увидите, что в ней помимо XMLдокументов, отвечающих за инициализацию предопределенных компонентов, есть файл undocum.xml. Открыв его, вы обнаружите, что он хранит тот же текст, что и созданный выше undocumented.xml.

Как видите, инициализировать пользовательские и недокументированные элементы при помощи объекта CustomActions довольно просто. Конечно, выполняемую методом instaU() работу несложно проделать и «вручную», просто поместив описывающий необходимые элементы XMLдокумснт в папку CustomActions. Однако у использования объекта CustomActions есть и свои достоинства. Во-первых, при этом инициализация не требует перезапуска Flash. Во-вторых, CustomActions дает возможность создать фильм, при помощи которого пользователь сможет, ничего не зная о принципах настройки панели Actions, инициализировать созданные вами компоненты или библиотеки классов. В принципе, код инициализации можно поместить даже в сам компонент.

Помимо install() у объекта CustomActions имеется еще три метода:

list() — возвращает массив, содержащий имена всех ХМ L-фаилов, имеющихся в папке CustomActions. Если данная папка пустая, то возвращается пустой массив. При возникновении ошибки результатом будет undefined. Например:

trace(CustomActions.list()); // Выводит: Flash Date Components, // FlashJavaScript, Screens, UlComponents, undocun

Метод list() может быть полезен, если вы хотите изменить или удалить один из созданных вами документов инициализации, но забыли, как он точно называется;

get(«name») — возвращает текст XML-документа с именем name.xml, принадлежащий папке CustomActions, как строку. Используется, если необходимо внести в документ инициализации изменения или просто просмотреть его. Например:

Рис.16.16.
Значек JSFLфайла

trace(CustomActions.get("undocum"));

//

В Output появляется текст

 

//

документа undocum.xml

uninstall(«name») — удаляет из папки CustomActions документ name.xml. Если удаление про-

ходит успешно, то метод возвращает true. Если имя файла было задано неверно (или он попросту не существует), результатом будет false.

Если вы не собираетесь использовать ветвь undocumented в дальнейшем, то удалите ее, выполнив в режиме тестирования следующий код:

CustomActions.uninstall("undocum");

Вернувшись в среду разработки, вы увидите, что ветвь undocumented исчезла. Не будет файла undocum.xml и в папке CustomActions.

16.6.3. Взаимодействие с JSFL

JSFL (JavaScript Flash Language) — это скриптопый язык среды разработки Flash MX 2004. Ис-

пользуя его, можно создавать собственные команды меню, инструменты, эффекты и прочие расширения. Любое действие, которое вы можете выполнить в среде разработки «вручную», может быть проделано посредством JSFL. Вопреки распространенному заблуждению, JSFL не является частью ActionScript. Более того, они связаны ничуть не больше, чем, например, ActionScript и JavaScript. JSFL является скриптовым языком программы Macromedia Flash MX 2004, a ActionScript — это скриптовый язык Macromedia Flash Player. Ввиду того что JSFL и ActionScript

напрямую не связаны, в рамках книги не будем давать подробного описания JSFL (для этого пришлось бы увеличить се объем, по крайней мере, вдвое). Ограничимся лишь кратким обзором JavaScript Flash Language. Чтобы лучше попять, как при помощи JSFL создаются расширения среды разработки, в проекте этой главы мы изготовим собственный инструмент.

JSFL, как ActionScript и JavaScript, основан на стандарте ЕСМА-262. Поэтому освоить его вам будет чрезвычайно просто. У JSFL такой же, как у этих языков, синтаксис, объектная модель, ему присуши такие неспецифичные классы, как Array, String, Math. Особенно близок JSFL к JavaScript (отсюда и название). Дело в том, что для описания среды разработки Flash была избрана та же объектная модель документа (DOM), которую использовали в свое время программисты Netscape для браузера. Поэтому если вы владеете JavaScript, многое в JSFL покажется вам знакомым.

Код JSFL сохраняется, как и код ActionScript, в обычных текстовых файлах, имеющих расширение *.jsfl. Для обозначения таких файлов есть специальный зна-

чок (рис. 16.16).

Создать JSFL-файл можно в любом текстовом редакторе. Однако если у лас установлена профессиональная версия Flash, то использовать их нет смысла. Дело в том, что в ней имеется особый режим редактирования кода JSFL. Войти в него можно, выбрав пункт Flash JavaScript File в меню Create New панели, появляющей-

ся при открытии программы. Данный режим более удобен, чем внешний текстовый редактор, так как в нем все элементы JSFL отображены в дереве языка слева на панели Actions, а также работает выделение цветом кода и выводятся всплывающие подсказки.

Язык JSFL по своей структуре является своего рода зеркальным отражением среды разработки Flash. Такие привычные понятия, как документ, временная шкала, инструмент, библиотека, существуют в нем в форме объектов. Например, инструмент панели Tools олицетворяет объект класса ToolObj. Документ принадлежит окну программы, библиотека — это часть документа, клип — элемент библиотеки. Иерархия элементов, присущая среде разработки, сохраняется и в JSFL. Обратиться к элементу уровня -V можно только через содержащий его элемент уровня N - 1.

На рис. 16.17 показана иерархическая структура объектов JSFL, Читая в данном обзоре о некото-

ром классе или объекте, возвращайтесь к этой схеме, чтобы лучше понять, какое место он занимает в языке. В результате вы сможете сложить для себя целостное представление о структуре JSFL, что позволит легко освоить язык, пользуясь одним лишь словарем от Macromedia.

На первом уровне в иерархии объектов JSFL (помимо глобальных функций) располагается только один объект — flash (к нему также можно обратиться по сокращенному имени «Л»). Объекту flash соответствует окно программы. Так как все элементы среды разработки принадлежат окну Flash, дочерними по отношению к объекту flash являются все остальные специфичные объекты JSFL,

Собственные методы объекта flash в основном решают же задачи, что и команды меню File среды разработки. Используя их, можно создать новый документ или закрыть существующий, сохранить его или закрыть окно программы. Свойства же объекта flash предназначены главным образом для доступа к объектам JSFL второго уровня. Например, описывающие открытые документы объекты класса Document хранятся в массиве flash, documents.

Рис. 16.17. Иерархия объектов JSFL

Для примера приведем код, создающий новый документ, затем сохраняющий его на диск С как example.fla, после чего закрывающий окно Flash:

flash.createDocument();

flash.saveDocument(flash.documents[0],"file:///C|/example.fla");

flash.quit(false);

Чтобы задействовать данный код, сохраните его в JSFL-файле, а затем просто два раза щелкните мышью по значку файла. Запустится Flash, и осе указанные действия будут проделаны. Выполнить код JSFL можно и командой из среды разработки, для чего служит пункт Run Command меню

Commands.

Ко второму уровню иерархии объектов JSFL относится около 10 видов объектов, важнейшими среди которых являются объект Tools и объекты класса Document. Объект Tools описывает панель инструментов среды разработки. Объектам класса Document соответствуют открытые в среде раз-

работки документы.

Объекты Document — это. пожалуй, самые важные элементы JSFL, Огромное количество принадлежащих им дочерних элементов, методов и свойств позволяет управлять всеми присущими FLAфайлу компонентами. 90 % JSFL —это элементы, подчиненные объектам класса Document. Только дочерних объектов первого уровня у объектов Document семь. Объектов же более низкой иерархии— десятки, причем степень их вложенности может доходить до восьми (см. рис. 16.17)!

Объекты класса Document, описывающие открытые FLA-документы, хранятся в массиве documents объекта flash. Порядок их расположения определяется последовательностью, в которой они были открыты. На практике, как правило, бывает необходимо работать с документом, находящимся в фокусе. Получить ссылку на соответствующий ему объект класса Document позволяет метод getDocumentDOM() объекта flash.

У класса Document имеется просто колоссальное количество свойств и методов. Используя их, можно создать фильм любой сложности только посредством одного лишь кода JSFL! Так как описать все свойства и методы класса Document в рамках данного обзора невозможно, приведем лишь несколько примеров.

Следующий код изменяет размер рабочего поля документа, а также частоту кадров:

var doc=flash.getDocumentDOM(); doc.width=200, doc.height=200; doc.frameRate=24;

Чтобы запустить режим тестирования, следует набрать

flash.getDocumentDOM().testMovie();

Следующая команда рисует круг:

flash.getDocumentDOM().addNewOval({left:100,top:100,right:200,bottom:200});

Перевести выделенный текст в кривые и заливку можно следующими двумя строками (дважды повторяем команду Break Apart):

flash.getDocumentDOM().breakApart();

//

Разбиваем текст на отдельные буквы

flash.getDocumentDOM().breakApart();

//

Преобразуем буквы в графику

Чтобы выделить все элементы на рабочем поле, введите

flash.getDocumentDOM().selectAll();

Чтобы создать экземпляр хранящегося в библиотеке клипа и поместить его в точку с координатами (100, 100), следует использовать приблизительно такой код:

var item=flash.getDocumentDOM().library.items[0]; flash.getDocumentDOM(),addItem({x:100,y:100},item);

Следующая строка аналогична команде File ► Save среды разработки:

flash.getDocumentDOM().save();

Импортировать SWF-файл в ту же директорию, где сохранен FLA-документ, можно, набрав

flash.getDocumentDOM().exportSWF(" ", true);

Строка выполняет те же действия, что и команда Publish меню File:

flash.getDocumentDOM().publish();

Не все команды, связанные с настройками FLA-документа, принадлежат классу Document. Некоторые из них для большей стройности языка были отнесены к классам, описывающим отдельные элементы FLA-документа — библиотеку, временную шкалу, опции линии и заливки. Объекты этих классов являются дочерними по отношению к объекту Document, и получить к ним доступ можно или через специальные свойства, или посредством особых методов типа get. Например, чтобы обратиться к объекту класса Timeline, которому соответствует временная шкала, нужно использовать функцию getTimeline() класса Document:

var timeline= flash.getDocument.Dem().getTimeline();

Операции над временной шкалой посредством JSFL можно проводить те же, что и «вручную*. К примеру, чтобы сделать десятый кадр ключевым, следует набрать

flash.getDocumentDOM().getTimeline().insertKeyframe(10);

Создать направляющий слой ниже выделенного слоя можно следующей строкой:

flash.getDocumentDOM().getTimeline().addNewLayer("Напр_спой","guide",false);

Продолжаем спускаться по лестнице вложенности объектов ветви Timeline. Слоям временной диаграммы соответствует отдельный класс Layer. Каждый слой описывает индивидуальный объект этого класса. Хранятся эти объекты в массиве layers объекта Timeline. Чем выше располагается слой, тем меньше будет индекс у управляющего им объекта Layer. Например:

flash.getDocumentDOM().getTimeline().addNewLayer <"Напр_слой","guide",false); flash.trace(flash.getDocumentDOM().getTimeline().layers[1].name);

// Выводит: Напр_слой

Классу Layer присущ ряд свойств, задающих характеристики слоя. Например, за то, будут ли отображаться объекты слоя, отвечает свойство visible:

// Делаем слой невидимым

flash.getDocumentDOM().getTimeline().layers[0].visible=false;

Логично предположить, что кадры временной диаграммы также должны описываться объектами отдельного класса. Так оно и есть. Всеми многочисленными опциями кадров можно управлять посредством свойств класса Frame. Объекты класса Frame, описывающие кадры слоя, хранятся в массиве frames соответствующего объекта класса Layer. Индекс объекта в массиве будет на единицу меньше, чем номер управляемого им кадра, Например, чтобы применить к размещенному на первом кадре первого слоя звуку эффект затухания, следует набрать

flash.getDocumentDOM().getTimeline().layers[0].frames[0].soundEffect='fade in';

Наиболее интересным для практики свойством класса Frame является actionScript, которое позволяет поместить на ключевой кадр код ActionScript. Для примера приведем скрипт JSFL, который создает новый документ, помешает на первый кадр первого слоя команду ActionScript, сохраняет документ, после чего закрывает его:

flash.createDocument(); flash.getDocumentDOM().getTimeline().layers[0].frames[0].actionScript="trace ('Привет');";

flash.saveDocument(flash.getDocumentDOM(), "file:///C|/TRACE.fla"); flash.getDocumentDOM().close(false);

На кадре могут располагаться экземпляры клипов и кнопок, растровые изображения, графика, текстовые поля. В JSFL каждому такому элементу будет соответствовать объект, причем элементы разных типов будут описывать объекты разных классов. Эти классы объединяет то, что они все

являются подклассами особого класса Element. Всего таких классов восемь (текстовые поля относятся к классу Text, графика — к классу Shape, экземпляры клипов и кнопок — к классу Instance и т. д.). Объекты, управляющие элементами кадра, хранятся в массиве elements объекта класса Frame. Их очередность зависит от последовательности отображения элементов. Чем выше располагается элемент, тем больше индекс будет у описывающего его объекта в массиве elements.

Классы группы Element позволяют проводить основные операции с элементами кадра. Например, чтобы увеличить вдвое все текстовые поля, принадлежащие первому кадру первого слоя документа, задействуйте следующий код:

var frame=flash.getDocumentDOM().getTimeline().layers[0].frames[0]. var frame_el=frame.elements;

for (var i = 0; i<frame_el.length; i++) { if (frame__el[i].elementType=="text") {

frame_el[i].width*=2, frame_el[i].height*=2;

}

}

Объекты некоторых классов группы Element имеют дочерние объекты. Таким образом, объекты отдельных классов могут иметь степень вложенности, равную девяти, по сравнению с объектом flash (то есть чтобы до них «добраться», требуется «пройти» восемь объектов). Поэтому не стоит удивляться, увидев ь коде JSFL строку, подобную следующей:

flash.getDocumentDOM().getTimeiine().layers[0].frames.elements[0].edges[0]. getHalfEdge(0).getVertex();

Объекты классов группы Element можно также встретить, если вы работаете с выделением. Дело в том, что у объекта Document имеется массив selection, хранящий ссылки на объекты, соответствующие которым элементы в данный момент являются выделенными.

Например:

// Увеличиваем все выделенные объекты вдвое var sel_objs=flash.getDocumentDOM().selection; for (var i=0; i<sel_objs.length; i++) {

sel_objs[i],width*=2, sel_objs[i].height*=2;

}

Ветвь языка, связанную с объектом Timeline, мы просмотрели практически полностью. Сделаем несколько шагов назад и вернемся на третий уровень вложенности. Помимо объекта класса Timeline у объекта Document имеется еще несколько дочерних объектов. Наиболее важным из них является объект класса Library, который управляет библиотекой документа. На него указывает свойство library класса Document.

В общем, класс Library предоставляет доступ к тем же операциям с библиотекой, что и одноименная панель. Например, чтобы создать экземпляр символа Clip и поместить его в точку (100, 100), нужно задействовать такую команду:

ilash.getDocuinentDOM().library.addItemToDocument({x:100, у:100}, "Clip"};

Следующая команда вызовет режим редактирования символа Clip:

flash.getDocumentDOM().library.editItem("Clip");

Подобно тому, как элементы, расположенные на кадре, управляются объектами классов группы Element, так и элементам в библиотеке соответствуют объекты ряда классов (класс SymbolItem — символы, класс FontItem — шрифты, BitmapItem — растровые изображения и т. д.). Надклассом всех этих классов является Item. Объекты, управляющие элементами библиотеки, хранятся в массиве items объекта класса Library. Их порядок будет тот же, в котором отображаются значки эле-

ментов на панели Library. Например:

flash.trace(flash, getDocumentDOM().library, items[0].name];

// Выводит: Clip

Класс Item имеет ряд довольно значимых для практики возможностей. К примеру, следующими строками можно присвоить клипу идентификатор программного экспорта «clip»:

flash.getDocumentDOM().library.items[0].linkageExportForAS=true; flash.getDocumentDOM().library.items[0].linkageIdentifier="clip";

Большинство подклассов класса Item «пустые». Но отдельные подклассы содержат полезные методы и свойства. Так, класс SoundItem дает возможность настроить параметры включаемого в фильм звука. Например, чтобы перевести все звуки в библиотеке в формат МРЗ с битрейтом 16 Кбит/с, необходимо выполнить следующий JSFL-код:

var library_items=flash.getDocumentDOM().library.items; for(var i=0; i<library_items.length; i++) {

if(library_items[i].itemType=="sound") { library_items[i].compressionType="MP3"; library_items[i].bitRate="16 kbps";

}

}

В общих чертах мы изучили основные элементы главной ветви дерева JSFL, связанной с объектами класса Document. Однако помимо объектов Document ко второму уровню иерархии языка относятся еще шесть типов объектов. Кратко охарактеризуем их:

Tools — соответствует панели инструментов среды разработки и хранится в свойстве tools объекта flash. Его свойства и методы предназначены для проведения наиболее общих операций, связанных с инструментами. Например, чтобы получить ссылку на активный в данный момент инструмент, следует набрать

var tool_active=flash.tools.activeTool;

Для управления инструментами панели Tools был введен специальный класс ToolObj. Для каждого инструмента создается отдельный объект этого класса. Хранятся такие объекты в массиве toolObjs объекта Tools.

Класс ToolObj применяется главным образом для создания собственных инструментов, но при помощи его можно влиять и на стандартные инструменты;

componentsPanel — управляет панелью Components;

outputPanel — объекту соответствует окно Output;

Math — хранит дополнительные математические методы (и основном для работы с матрицами), которых нет в глобальном объекте Math;

Effect — класс, предназначенный для создания эффектов временной диаграммы;

drawing Layer — объект, описывающий гипотетический слой, на котором располагается фигура в момент ее создания при помощи любого инструмента рисования. После того как кнопка мыши отпускается, фигура переносится с гипотетического слоя на настоящий;

XMLUI — зачастую при создании команд бывает необходимо, чтобы пользователь мог передать коду некоторые параметры. В JSFL эта задача решается выведением специального диалогового окна (похожее окно появляется, например, когда вы активизируете команду Modify ► Bitmap ► Trace Bitmap). То, как должно выглядеть это окно и какие переменные будут из него

определяться, задается посредством особого XML-файла, отчего управляющий данным окном класс и имеет столь необычное название — XMLUI (сокращение от XML и User Interface).

Глобальной видимостью, помимо объекта flash, обладают осе стандартные функции, классы и объекты ЕСМА-262: escape(), Array, String, Math и т. д. Кроме того, к первому уровню иерархии объектов JSFL относится несколько специфичных для среды разработки Flash функций. Данные функции активизируются при наступлении ряда событий, откуда и их названия — mouseDown(), mouseClick(), keyUp() и т.п. Глобальных функций JSFL немного и используются они главным образом при создании инструментов для панели Tool. Более обстоятельно с ними познакомимся в проекте этой главы.

JSFL не такой сложный и объемный язык, как ActionScript. Облегчает его изучение и то, что практически всем объектам языка соответствуют хорошо знакомые элементы среды разработки. Поэтому с нашей стороны не будет излишне смелым попытаться реализовать какое-нибудь полезное расширение прямо сейчас. Попробуем написать на JSFL команду, создающую на основе выделенного текста анимацию, и которой по тексту будет бежать волна (подобный эффект уже был реализован в главе 13 посредством ActionScript).

1.Создайте новый JSFL-файл и назовите его WaveText.

2.Перед тем как выполнить код команды, следует убедиться, что в документе имеется только один выделенный элемент, причем этот элемент — текстовое поле.

Ссылки на соответствующие выделенным элементам объекты классов группы Element хранит массив selection, Значит, нам нужно проверить длину данного массива и тип хранящегося в нем элемента. Если условия, необходимые для выполнения командой своих функций, не будут соблюдены, то следует отобразить информационную панель с сообщением об ошибке:

var doc=flash.getDocuraentDOM();

if (doc.selection.length !=1 && doc.selection[0].element Type !=" text" ) { alert ("Выделите одно текстовое поле и повторите команду"};

} else {

3.Как бы мы создавали анимацию волнообразного текста «вручную»? Очевидно, что поместили бы текстовое поле в клип, а затем разбили его на отдельные буквы командой Break Apart. Потом мы бы так изменили размеры каждой буквы, чтобы получилась волна. Затем добавили бы еще один ключевой кадр и поменяли на нем размеры букв, чтобы образуемая ими волна слегка сместилась по сравнению с первым кадром. Похожим образом для создания более-менее живой анимации нам понадобилось бы заполнить 15-20 кадров. Даже если букв в строке немного, эта работа заняла бы не меньше часа (а что если их десятки?).

Самое приятное в работе с JSFL то, что для достижения желаемого эффекта алгоритм может проделывать точно такие же действия, которые мы бы выполняли «вручную». Итак, вначале нам следует поместить выделенное поле в новый клип. Для этого нужно использовать метод класса

Document convertTo Symbol (type, name, centerLock), где type — тип символа (возможные значения: «movie clip», «button», «graphic»), name — имя символа в библиотеке, centerLock — располо-

жение точки центра («top left», «center», «bottom right» и т. д.). Имя символа должно быть уникальным, но в то же время читабельным. Решаем эту проблему следующим образом: запускаем цикл и формируем имя по принципу «sinText»+i, где i — целое число. Как только обнаружится, что символа с таким именем в библиотеке нет (определить это позволяет метод itemExists() класса Library), создаем необходимый клип.

var name="sinText", n=0; while(doc.library.itemExists(name+n)) {

n++;

}

doc.convertToSymbol("movie clip",name+n,"center")

4. Далее мы должны перейти в режим редактирования нового клипа:

doc.enterEditMode();

5. Теперь нужно разбить текст на отдельные буквы, применив к нему команду Break Apart:

doc.breakApart();

6. Далее при помощи цикла создаем последовательность из 16 ключевых кадров. Необходимые буквы будут скопированы на них автоматически:

var timln=doc.getTimeline(); for (var k=1; k<16; k++) {

timIn.insertKeyframe(i+1);

}

7. Теперь мы должны последовательно перебрать все 16 кадров, изменяя размеры букв так, чтобы они образовали бегущую волну. Выделить некоторый кадр или несколько кадров на временной диаграмме позволяет метод класса Timeline setSelectedFrames(begin, end), где begin — номер кад-

ра, начинающего подлежащую выделению последовательность, end — номер кадра, перед которым она завершается. Отсчет кадров ведется с нуля.

После того как кадр будет выделен, размер букв должен быть изменен по закону синуса. Сделать это довольно несложно, так как объекты массива selection, соответствующие буквам, будут организованы в той же последовательности, что и сами буквы (а никаких других элементов в клипе нет). Скорость движения волны произвольная и зависит от разности фаз колебаний соседних букв. У нас разность фаз для двух соседних букв будет составлять 15 градусов. Разность фаз колебаний последней буквы кадра ;V и первой буквы кадра N + 1 также должна быть 15 градусов. Важное условие: разность фаз следует подбирать так, чтобы при прокручивании анимации в цикле создавалось впечатление непрерывного движения (т. е. разность фаз между последней буквой последнего кадра и первой буквой первого кадра должна быть такой же, как разность фаз соседних букв).

var phi=Math.PI/8;

//

Разность фаз

var mat=null;

//

Переменная для матрицы преобразований

for(var i=0; i<15; i*+){ //

Перебираем все кадры

timIn.setSelectedFrames(i, i+1); // Вселяем кадр i

for(var j=0; j<doc.selection.lenqth; j++){ // Перебираем буквы

//Считываем матрицу преобразований данной буквы mat=doc.selection[j].matrix;

//Модифицируем элементы матрицы, отвечающие за масштабирование mat.a=mat.d=Math.abs[Math.sin(phi*(i+j)));

//Заменяем старую матрицу на модифицированную doc.selection[j].matrix=mat;

}

}

В JSFL для осуществления таких преобразований, как поворот, перенос, относительное масштабирование, используются матрицы преобразований. Им соответствуют объекты особого класса Matrix, которые хранятся в свойстве matrix объектов классов группы Element. В приведенном выше коде мы воспользовались матрицей преобразований, переопределив элементы (0, 0) (свойство а) и (1,1) (свойство d), отвечающие за коэффициенты масштабирования по горизонтали и по вертикали.

Если вы не понимаете, что такое матрица преобразований, то прочитайте параграф, посвященный градиентам в главе 10, а также относящийся к той же главе проект. Там вы найдете исчерпывающее описание этого важнейшего понятия.

После того как буквы будут организованы нужным образом, необходимо выйти из режима редактирования клипа:

doc.exitEditMode();

Готово. Сохранив JSFL-файл, откройте новый FLA-документ. Создайте статичное текстовое поле с любым текстом. Выделив его, вызовите команду sinText через окно, открываемое пунктом Run Command меню Commands. Если все было сделано верно, то окно Flash станет на несколько секунд недоступным. Затем вы увидите, что текст приобрел форму волны и был помещен в клип. Откройте этот клип. Как и задумывалось, на его временной диаграмме имеется 16 ключевых кадров. Войдите в режим тестирования. Ура! Все работает!

Наша команда не лишена недостатков. Нельзя произвольно задавать частоту колебаний, их амплитуду. Если бы этот пример не был учебным, то при запуске команды нужно было бы выводить специальное диалоговое окно, в котором пользователь мог бы задавать параметры. Управляет этим окном особый объект JSFL второго уровня XMLUI. То, сколько в окне будет полей, как они будут называться и какие переменные с ними будут связаны, описывается в специальном XMLдокументе, хранящемся в той же папке, что и JSFL-файл.

Если вы создали или скачали из Сети особо полезную команду JSFL, то ее стоит сделать легкодоступной. Для этого поместите ее в папку Commands директории Configuration (ее адрес в Windows 98/XP C:\Documents and Settings\user\Local Settings\ Application Data\Macromedia\Flash MX 2004\en\Configuration). В результате после перезапуска программы соответствующий этой команде пункт будет добавлен вменю Commands. Изменить название или удалить JSFL-команду из меню Commands можно при помощи панели, вызываемой командой Manage Saved Commands того же меню. Скачать дополнительные бесплатные расширения от Macromedia можно со страницы, от-

крываемой командой Get More Commands меню Commands.

Аналогично командам встраиваются и инструменты. Для этого описывающие их файлы следует поместить в папку Tools директории Configuration.

Завершая разговор о командах JSFL, стоит упомянуть самый простой способ их создания. Во Flash MX 2004 появилась панель History, в которой отображается список всех проделанных пользователем операций. Если окажется, что некоторую группу операций вам требуется осуществить многократно, то просто выделите соответствующие им строки в списке панели History и задействуйте команду Save As Command ее меню. При этом появится одноименная команде панель, в строке Command Name которой нужно ввести имя новой команды. После того как вы нажмете ОК., в меню Commands отобразится созданная команда, а в папку Commands будет помещен описывающий ее JSFL-файл. Например, если вы нарисуете треугольник, а затем создадите на основании проделанных операций команду, то Flash сгенерирует приблизительно следующий JSFL-код:

fl.getDocumentDOM().addNewLine({x:40,y:148}, {x:84,y:216}); fl.getDocumentDOM().addNewLine({x:83,y:213), {x:107,y:124}); fl.getDocumentDOM().addNewLine({x:107,y:124}, {x:40,у:146});

Установка расширений, созданных как с использованием JSFL, так и без него — это не сложная операция, но требующая определенных познаний. Чтобы упростить и формализовать инсталляцию расширений, компания Macromedia создала небольшую бесплатную утилиту Macromedia Extension Manager, у которой имеется собственный формат файлов — *.mxp. Данные файлы обычно создаются простым слиянием файла расширения и описывающего его XML-документа. Macromedia Extension Manager позволяет создавать МХР-файлы и инст&плировать1 их в систему (при этом она просто переносит их в папку Extensions папки Configuration). Считается хорошим тоном «упаковывать» расширения в МХР-фор-мат, поэтому обязательно скачайте Extension Manager с сайта Macromedia. Тем более, подавляющее большинство расширений (команд, инструментов, компонентов), выложенных в Сети, имеет формат *.mxp. Более обстоятельно Extension Manager обсудим в главе 19, когда будем разбирать компоненты.

Команды и инструменты — это самые простые элементы, которые можно создать посредством JSFL. Более сложными являются эффекты вроде стандартных для временной диаграммы (Insert ► Timeline Effects). Для их реализации помимо кода JSFL нужно разрабатывать SWF-фильм с ин-

Соседние файлы в папке Литература