
- •Оглавление
- •Вступление
- •Глава 1. Язык сценариев. ActionScript: начальные сведения
- •Проект 1: Прыгающий мяч (программная анимация)
- •1.1. Среда разработки ActionScript: настройка и приемы работы
- •1.1.1. Различие между стандартной и профессиональной версиями Flash
- •1.1.2. Панель Actions
- •1.1.3. Режим упрощенного ввода кода. Панель Behaviors
- •1.1.4. Как упростить создание кода на панели Actions
- •1.1.5. Типы сценариев
- •1.1.6. Централизация кода
- •1.1.7. Инструменты работы с кодом
- •1.1.8. Настройки стиля кода
- •1.1.9. Сохранение ActionScript-кода
- •1.1.10. Функция trace() и панель Output
- •1.1.11. Справочная информация
- •1.2. Синтаксис ActionScript
- •1.2.1. Пробельные символы
- •1.2.2. Завершение предложений
- •1.2.3. Чувствительность к регистру
- •1.2.4. Зарезервированные слова ActionScript
- •1.2.5. Принципы присвоения имен
- •1.2.6. Комментарии
- •1.3. Основные понятия
- •1.3.2. ActionScript как скриптовый язык Flash-плейера
- •1.3.3. Интерпретатор ActionScript. Flash-ассемблер
- •1.3.4. Символы и экземпляры символов
- •1.3.5. Переменные
- •1.3.6. Функции
- •1.3.7. Условные предложения
- •1.3.8. Циклы
- •1.3.9. Массивы
- •1.3.10. Объектная модель ActionScript
- •1.3.11. Свойства _root, _parent, Leveln и ключевое слово this
- •1.3.12. Области видимости кода
- •1.3.1. ЕСМА-262 как основа ActionScript
- •Глава 2. Типы данных
- •2.3. Математические функции и константы. Объект Math
- •2.3.1. Особенности реализации математических функций
- •2.3.2. Возведение в степень и вычисление квадратного корня
- •2.3.3. Экспонента и натуральный логарифм
- •2.3.5. Случайные числа
- •2.3.6. Округление до целого числа
- •2.3.7. Сравнение пары чисел
- •2.3.8. Тригонометрические функции
- •2.3.9. Математические константы
- •2.4. Строки (тип string)
- •2.4.1. Создание строк
- •2.4.2. Элементарные операции со строками
- •2.4.3. Класс String
- •2.4.4. Определение длины строки. Свойство lengths
- •2.4.5. Соединение строк. Метод concat()
- •2.4.6. Выделение символа строки по индексу. Метод charAt()
- •2.4.7. Поиск в строке. Методы indexOf() и lastIndexOff()
- •2.4.8. Извлечение подстроки. Методы substring(), substr(), slice()
- •2.4.9. Преобразование строк в массивы. Метод split()
- •2.4.12. Преобразование строк в идентификаторы. Функция eval()
- •2.4.13. Текстовые поля
- •2.5. Кодировка символов. Уникод во Flash
- •2.5.1. Немного истории
- •2.5.2. Поддержка уникода Flash-плейером
- •2.5.3. Поддержка уникода средой разработки
- •2.5.4. Добавление символов уникода
- •2.6. Логические величины (тип boolean)
- •2.6.1. Класс Boolean
- •2.7. Тип undefined
- •2.8. Тип null
- •2.9. Объекты (тип object)
- •2.9.1. Атрибуты свойств
- •2.9.2. Изменение атрибутов свойств. Функция ASSetPropFlags()
- •2.10. Клипы (тип movieclip)
- •2.11. Преобразование типов данных
- •2.11.1. Правила преобразования типов
- •2.11.2. Автоматическое преобразование типов
- •2.12. Строгая типизация в ActionScript
- •Проект 2: Калькулятор
- •2.1. Определение типа объекта данных
- •2.2. Числа (тип number)
- •2.2.1. Виды чисел в ActionScript
- •2.2.2. Особенности представления чисел
- •2.2.3. Операции с числами
- •2.2.4. Класс Number — методы и свойства
- •2.2.5. Преобразование строк в числа. Функции parseInt() и parseFloat()
- •Глава 3. Переменные
- •3.1. Создание переменных
- •3.2. Особенности типизации переменных
- •3.3. Локальные переменные функций
- •3.4. Глобальные переменные
- •3.5. Особенности операции присваивания
- •3.6. Есть ли переменные в ActionScript?
- •3.7. Удаление переменных
- •Проект 3: Пружинный маятник
- •Глава 4. Функции
- •4.1. Создание функций
- •4.2. Вызов функций
- •4.3. Предложение return
- •4.4. Рекурсия
- •4.5. Особенности цепочки областей видимости функций
- •4.6. Объект arguments
- •4.6.1. Формальные параметры и объект arguments
- •4.6.2. Свойства объекта arguments
- •4.7. Особенности передачи в функции составных объектов данных
- •4.8. Функции как объекты
- •4.8.1. Класс Function
- •4.8.2. Свойство prototype
- •4.8.3. Методы вызова функции
- •4.9. Функции на стадии выполнения. Объект активации
- •Проект 4: Крестики-нолики
- •Глава 5. Операторы
- •5.1. Виды операторов
- •5.2. Иерархия операций
- •5.3. Сочетательность операций
- •5.4. Арифметические операторы
- •5.5. Операторы присваивания
- •5.5.1. Оператор =
- •5.5.2. Операторы присваивания с модификацией
- •5.5.3. Инкрементирование и декрементирование
- •5.6. Операторы равенства и сравнения
- •5.6.1. Операторы равенства
- •5.6.2. Операторы сравнения
- •5.7. Логические операторы
- •5.8. Условный оператор (?:)
- •5.9. Служебные операторы
- •5.9.1. Инициализаторы литералов
- •5.9.2. Оператор группирования
- •5.9.3. Операторы доступа к свойствам
- •5.9.4. Оператор вызова функции
- •5.9.5. Оператор new
- •5.9.6. Оператор super
- •5.9.7. Оператор delete
- •5.9.8. Оператор typeof
- •5.9.9. Оператор instanceof
- •5.9.10. Оператор void
- •5.9.11. Оператор «запятая»
- •5.10. Поразрядные операторы
- •5.10.1. Логические поразрядные операторы
- •5.10.2. Операторы поразрядного сдвига
- •Проект 5: 3D-конструктор
- •Глава 6. Предложения
- •6.1. Блок предложений
- •6.2. Предложения var и function
- •6.3. Предложения выражений и пустые предложения
- •6.4. Предложение return
- •6.5. Предложение with
- •6.6. Условные предложения
- •6.6.1. Предложение if
- •6.6.2. Предложение switch
- •6.7. Циклы
- •6.7.1. Циклы с предусловием (while и do—while)
- •6.7.2. Цикл с параметром (for)
- •6.7.4. Предложения break и continue
- •6.7.5. Ограничение на время выполнения кода
- •6.7.6. Циклы события onEnterFrame и временной диаграммы
- •6.7.7. Циклический вызов функций. Функция setInterval()
- •Проект 6: Тетрис
- •Глава 7. Массивы (класс Array)
- •7.1. Создание массивов
- •7.2. Извлечение и переопределение элементов массива
- •7.3. Длина массива. Свойство length
- •7.4. Добавление элементов в массив
- •7.5. Удаление элементов массива
- •7.6. Слияние массивов
- •7.7. Выделение фрагмента массива
- •7.8. Инверсия массива
- •7.9. Сортировка массива
- •7.10. Преобразование массива в строку
- •7.11. Многомерные массивы
- •7.13. Особенности реализации массивов в ActionScript
- •Проект 7: Пиксельное табло
- •Глава 8. События
- •8.1. Модель событий Генератор—Листенеры
- •8.1.1. Обработчики событий
- •8.1.2. Листенеры
- •8.2. Событийные методы
- •8.3. Модель событий Flash 5
- •8.4. Обновление экрана при событиях
- •Проект 8: Создаем события сами
- •Глава 9. Объектно-ориентированное программирование
- •9.2.1. Объекты
- •9.2.2. Свойства
- •9.2.3. Методы
- •9.2.4. Классы
- •9.2.5. Наследование
- •9.2.6. Создание надклассов и подклассов
- •9.2.7. Концепция создания надклассов Flash 6
- •9.2.8. Оператор super
- •9.2.9. Свойства и методы конструктора класса
- •9.2.10. Определение принадлежности объекта к классу
- •9.2.11. Цепочка областей видимости. Объект Global
- •9.3. Класс Object
- •9.3.1. Создание объектов класса Object
- •9.3.2. Метод registerClass(). Выделение экземпляров клипа в класс
- •9.3.3. Метод addProperty(). Свойства типа getter/setter
- •9.3.4. Методы watch() и unwatch(). События изменений свойств
- •9.3.5. Прочие методы класса Object
- •9.4.1. Создание классов
- •9.4.2. Задание наследуемых свойств и методов класса
- •9.4.3. Конструктор класса. Инициализация собственных свойств и методов объектов
- •9.4.4. Особенности задания методов в AciionScript2.0
- •9.4.5. Статичные члены класса
- •9.4.7. Динамические классы
- •9.4.8. Наследование
- •9.4.9. Интерфейсы
- •9.4.10. Свойства типа getter/setter
- •9.4.11. Выделение экземпляров символа в подкласс
- •9.4.12. Особенности контроля на этапе компиляции
- •9.4.13. Особенности импорта внешних классов
- •9.4.14. Пакеты
- •9.4.15. Встроенные классы. Директива intrinsic
- •Проект 9: Модель идеального газа
- •Глава 10. Клипы
- •10.1. Глобальные функции и свойства
- •10.2. Отличия клипов от объектов
- •10.2.1. Свойства клипов
- •10.3. Клипы как носители кода
- •10.3.1. Последовательность выполнения кода
- •10.3.2. Особенности использования свойств и методов класса MovieClip
- •10.4. Особенности основной временной диаграммы _root
- •10.5. Создание экземпляров клипов
- •10.5.1. Метод duplicateMovieClip()
- •10.5.3. Метод createEmptyMovieClip(). Создание пустого клипа
- •10.6. Виртуальные слои клипов
- •10.6.1. Изменение глубины клипа. Метод swapDepths()
- •10.7. Импорт внешних фильмов и изображений
- •10.7.2. Импорт внешних фильмов при помощи функций loadMovie() и loadMovieNum()
- •10.7.3. Импорт изображений
- •10.7.4. Импорт фильмов и изображений при помощи класса MovieClipLoader
- •10.7.5. Создание предзагрузчиков
- •10.7.6. Кэширование swf-фильмов
- •10.7.7. Изменение глубины основной временной диаграммы
- •10.7.8. Доступ из одного фильма к объектам другого
- •10.7.9. Обобщенные библиотеки
- •10.8. Имена экземпляров клипов
- •10.9. Ссылки на клипы
- •10.9.1. Свойство _lockroot
- •10.9.2. Определение пути к клипу
- •10.9.3. Инструмент Insert Target Path
- •10.10. Система координат клипов
- •10.10.1. Свойство _x и _y
- •10.10.2. Пересчет координат из одной системы в другую
- •10.10.3. Масштаб осей
- •10.10.4. Размер клипа
- •10.10.5. Границы клипа
- •10.10.6. Поворот системы координат
- •10.11. Прозрачность и видимость клипа
- •10.11.1. Свойство _alpha
- •10.11.2. Свойство _visible
- •10.12. Перемещаемые клипы. Метод startDrag()
- •10.12.1. Свойство _droptarget
- •10.13. Коллизии клипов. Метод hitTest()
- •10.13.1. Определение пересечения двух клипов
- •10.13.2. Определение принадлежности точки к клипу
- •10.13.3. Определение коллизии клипов с использованием поточечного перебора
- •10.14. Управление временной диаграммой
- •10.14.1. Начало и остановка проигрывания клипа
- •10.14.2. Переход на новый кадр
- •10.14.3. Определение номера проигрываемого кадра
- •10.15. Программные маски
- •10.16. Удаление экземпляров клипов и фильмов
- •10.16.1. Удаление экземпляров. Метод removeMovieClip()
- •10.16.2. Выгрузка содержимого экземпляров. Метод unloadMovie()
- •10.16.3. Выгрузка фильмов
- •10.17. События
- •10.17.1. Создание обработчиков событий в стиле Flash 5
- •10.17.2. Событие смены кадров (onEnterFrame)
- •10.17.3. Событие загрузки клипа (onLoad)
- •10.17.4. Событие выгрузки клипа (onUnload)
- •10.17.5. Событие поступления данных (onData)
- •10.17.6. События мыши (onMouseDown, onMouseUp, onMouseMove)
- •10.17.7. События клавиатуры (onKeyDown, onKeyUp)
- •10.17.8. «Кнопочные» события
- •10.17.9. События фокуса (onSetFocus, onKillFocus)
- •10.18. Программное рисование
- •10.18.1. Рисование прямыми отрезками
- •10.18.2. Рисование фрагментами парабол
- •10.18.3. Однородная заливка
- •10.18.4. Градиентная заливка
- •10.18.5. Удаление программной графики
- •10.19. Управление цветом клипов. Класс Color
- •10.19.1. Цветовые модели
- •10.19.2. Задание формулы цвета
- •10.19.3. Задание цвета клипа. Метод setRGB()
- •10.19.4. Цветовые трансформации. Метод setTransform()
- •Проект 10: Рисование 3D-объектов
- •Глава 11. Кнопки
- •11.1. Создание кнопок
- •11.2. Сходства и различия кнопок и клипов
- •11.3. События кнопок
- •11.3.1. Особенности событий кнопок
- •11.3.2. События кнопок в стиле Flash 5
- •11.4. Режим элемента меню
- •11.5. Вид указателя мыши
- •11.6. Отключение кнопок
- •11.7. Управление кнопками при помощи клавиатуры
- •11.7.1. Динамическое наведение фокуса
- •11.7.2. Свойство _focusrect
- •11.7.3. События onSetFocus и onKillFocus
- •11.7.4. Задание маршрута клавиатурного обхода
- •11.7.5. Особенности клавиатурного обхода и программного фокуса в случае клипов
- •11.8. Клипы как кнопки
- •Проект 11: Факел
- •Глава 12. Работа с мышью и клавиатурой
- •12.1. Работа с мышью
- •12.1.1. Определение координат указателя мыши
- •12.1.2. События мыши
- •12.1.3. Скрытие указателя мыши
- •12.1.4. Правая клавиша мыши
- •12.1.5. Определение выхода указателя мыши за пределы окна плейера
- •12.2. Контекстное меню
- •12.2.1. Настройка контекстного меню. Класс ContextMenu
- •12.2.2. Введение в контекстное меню собственных команд
- •12.3. Работа с клавиатурой
- •12.3.1. Особенности событий клавиатуры
- •12.3.2. События onKeyDown и onKeyUp
- •12.3.3. Определение кода нажатой клавиши. Метод getCode()
- •12.3.4. Определение кода введенного символа. Метод getAscii()
- •12.3.5. Проверка нажатия клавиши. Метод isDown()
- •12.3.6. Проверка активности специальных режимов. Метод isToggled()
- •Проект 12: Эластики
- •Глава 13. Работа с текстом
- •13.1. Создание текстовых полей
- •13.1.1. Создание текстовых полей при помощи инструмента Text
- •13.1.2. Переменная поля
- •13.1.3. Динамическое создание текстовых полей
- •13.2. Удаление текстовых полей
- •13.3. Текстовые поля как визуальные объекты
- •13.4. Задание и извлечение текста поля
- •13.5. Настройка текстового поля
- •13.5.1. Управление размером поля
- •13.5.2. Рамка и задний фон
- •13.5.3. Поля однострочные и многострочные
- •13.5.4. Ограничение на количество символов
- •13.5.5. Поле паролей
- •13.5.6. Ограничение на вводимые символы
- •13.5.7. Выделение текста поля
- •13.6. Настройка стиля текста. Класс TextFormat
- •13.6.1. Задание гарнитуры
- •13.6.2. Размер шрифта
- •13.6.3. Цвет шрифта
- •13.6.4. Начертание шрифта
- •13.6.5. Выключка
- •13.6.6. Подчеркнутый шрифт
- •13.6.7. Гиперссылки
- •13.6.8. Форматирование текста
- •13.6.9. Определение размерных параметров текста
- •13.7. Работа со шрифтами
- •13.7.1. Шрифты системные и встроенные
- •13.7.2. Ненаправленные гарнитуры
- •13.7.3. Особенности встраивания шрифтов
- •13.7.4. Встраивание в фильм целого шрифта
- •13.7.5. Встраивание глифов отдельных символов и последовательностей символов
- •13.7.6. Проблема читабельности при отображении мелкого текста
- •13.8. Событие onChanged
- •13.9. Прокрутка текстовых полей
- •13.10. Работа с фокусом
- •13.11. Форматирование текста при помощи HTML
- •13.11.5. Тег <FONT> ... </FONT>
- •13.11.10. Тег <TEXTFORMAT> ... <TEXTFORMAT>
- •13.11.11. Тег <SPAN> ... </SPAN>
- •13.11.13. Автоматическое удаление пробелов. Свойство condenseWhite
- •13.12. Форматирование текста с использованием каскадных таблиц стиля (CSS)
- •13.12.1. Основные положения технологии CSS
- •13.12.2. Создание объекта таблиц стиля
- •13.12.3. Применение объекта стиля к текстовому полю
- •13.12.4. Элементы CSS, поддерживаемые Flash-плейером
- •13.13. Работа с выделением. Объект Selection
- •13.13.1. Управление фокусом поля. Методы getFocus() и setFocus()
- •13.13.2. Событие изменения фокуса (onSetFocus)
- •13.13.4. Определение и задание положения курсора ввода
- •13.13.5. Динамическое задание выделения. Метод setSelection()
- •13.13.6. Динамическая замена выделенного текста. Метод replaceSel()
- •13.14. Работа со статичным текстом. Объект TextSnapshot
- •13.14.1. Создание объектов класса TextSnapshot
- •13.14.2. Считывание текста статичных полей
- •13.14.3. Поиск строки в статичном тексте
- •13.14.4. Программное выделение статичного текста
- •13.14.5. Определение ближайшего к точке символа статичного текста
- •13.15. Копирование текста в буфер обмена
- •13.16. Поддержка многоязычности. Панель Strings
- •Проект 13: Текстовые эффекты
- •Глава 14. Время и дата
- •14.1. Основные понятия теории измерения времени
- •14.2. Компьютерное время
- •14.3. Класс Date
- •14.3.1. Создание объектов класса Date
- •14.3.2. Методы класса Date
- •14.4. Определение времени, прошедшего с начала проигрывания фильма
- •Проект 14: Программные часы
- •Глава 15. Работа со звуком
- •15.1. Основные понятия теории цифрового звука
- •15.1.1. Частота дискретизации
- •15.1.2. Разрядность выборок
- •15.1.3. Количество каналов
- •15.1.4. Алгоритмы компрессии
- •15.1.5. Форматы хранения
- •15.2. Событийный (event) и потоковый (stream) звук
- •15.3. Операции со звуком без использования программирования
- •15.4. Создание объектов класса Sound
- •15.5. Динамическое присоединение звука. Метод attachSound()
- •15.6. Импортирование внешних МР3-файлов
- •15.6.1. Метод loadSound()
- •15.6.2. Отслеживание окончания загрузки. Событие onLoad
- •15.6.3. Создание предзагрузчиков для импортируемых звуков
- •15.7. Управление воспроизведением звуков
- •15.7.1. Запуск воспроизведения. Метод start()
- •15.7.3. Событие onSoundComplete
- •15.8. Свойства position и duration
- •15.9. Управление параметрами воспроизведения
- •15.9.1. Громкость звука
- •15.9.2. Баланс
- •15.9.3. Детальное управление стереозвучанием. Метод setTransform()
- •15.10. Чтение ID3-тегов МР3-звуков
- •Проект 15: МР3-плейер
- •Глава 16. Взаимодействие с локальным окружением
- •16.1. Взаимодействие с импортированными фильмами
- •16.2. Взаимодействие с плейером
- •16.2.1. Определение версии и типа плейера
- •16.2.2. Режимы масштабирования
- •16.2.3. Типы выравнивания
- •16.2.4. Определение размеров фильма и величины окна плейера
- •16.2.5. Событие onResize
- •16.2.6. Цвет фона
- •16.2.7. Качество отображения
- •16.2.8. Панель небезопасных настроек плейера
- •16.3. Дополнительные возможности автономного плейера
- •16.3.1. Проекторы
- •16.3.2. Функция fscommandf()
- •16.4. Взаимодействие между фильмами, проигрываемыми разными плейерами
- •16.4.1. Создание кода отправки данных
- •16.4.2. Создание кода получения данных
- •16.4.3. Пример использования класса LocalConnection
- •16.5. Взаимодействие с браузером
- •16.5.1. Теги <EMBED> и <OBJECT>
- •16.5.2. Передача данных из HTML-окружения при загрузке фильма
- •16.5.3. Решение проблемы кнопок навигации браузера
- •16.5.4. Передача команд браузеру. Функция getURL()
- •16.5.5. Взаимодействие с JavaScript при помощи функции fscommand()
- •16.5.6. Управление SWF-фильмом посредством JavaScript
- •16.5.7. Определение наличия в системе Flash-плейера нужной версии
- •16.6. Взаимодействие со средой разработки
- •16.6.1. Настройка панели Actions
- •16.6.2. Объект CustomActions
- •16.6.3. Взаимодействие с JSFL
- •16.7. Взаимодействие со средствами чтения с экрана
- •16.8. Получение информации об использующемся аппаратном и программном обеспечении
- •16.9. Сохранение данных на диске
- •16.9.1. Создание объектов SharedObject
- •16.9.2. Чтение данных из объектов SharedObject
- •16.9.3. Удаление sol-файлов
- •16.9.4. Серверные объекты SharedObject
- •16.9.5. Решение проблемы выделения цветом посещенных ссылок
- •16.10. Взаимодействие с принтером
- •16.10.1. Функции печати
- •16.10.2. Класс PrintJob
- •Проект 16: Создаем свой инструмент
- •Глава 17. Обмен текстовыми данными с сервером
- •17.1. Принципы сетевой безопасности Flash MX 2004
- •17.1.1. Правила определения идентичности доменов
- •17.1.2. Требование идентичности протоколов
- •17.1.3. Снятие ограничений на доступ к содержимому фильма
- •17.1.4. Снятие ограничений на доступ к внешним данным
- •17.1.5. Преодоление ограничений для сокетов
- •17.1.6. Создание приложений, отвечающих принципам безопасности
- •17.2. Загрузка текстовых данных с сервера
- •17.2.1. Создание файла сданными
- •17.2.2. Функция loadVariables()
- •17.2.3. Класс LoadVars
- •17.3. Взаимодействие с серверным скриптом
- •17.3.1. Запрос с выводом результата в браузере
- •17.3.2. Запрос с отправкой результата в фильм
- •17.3.3. Задание заголовков запроса
- •17.4. Работа с сокетами
- •17.4.1. Класс XMLSocket
- •17.4.2. Создание сокета-сервера
- •17.5. Работа с XML
- •17.5.1. Введение в ХМL
- •17.5.2. Объектная модель XML. DOM
- •17.5.3. Преобразование XML-текста в дерево объектов DOM
- •17.5.4. Обход дерева DOM
- •17.5.5. Создание и модификация XML-документа
- •17.5.6. Обмен XML-данными с сервером
- •Проект 17: Создаем сетевую игру
- •Дополнительные главы
- •Глава 18. Обмен с сервером сложными данными
- •Глава 19. Компоненты
- •Глава 20. Полезные мелочи

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, как строку. Используется, если необходимо внести в документ инициализации изменения или просто просмотреть его. Например:

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-фильм с ин-