
- •Оглавление
- •Вступление
- •Глава 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. Полезные мелочи
Рис. 16.4. Масштабирование в режиме «noScale»:
а— вид по умолчанию; b — вид фильма после увеличения размера окна плеера;
с— вид фильма после уменьшения окна плеера
Если публикация HTML-страницы осуществляется из Flash, то, чтобы задать режим масштабирования, обратитесь к меню Scale закладки HTML окна Publish Settings. Размер области фильма можно определить там же, задействовав команду Pixels (абсолютный размер в пикселях) или Percent (относительный размер в процентах от стандартного) меню Dimensions. Очевидно, что, для того чтобы выбранный режим масштабирования проявил себя, размер области отображения должен отличаться от стандартного размера фильма.
До Flash MX различные режимы масштабирования можно было использовать только в случае фильмов, опубликованных на HTML-странице. Фильмы же, открытые плейером или браузером напрямую, применяли режим по умолчанию «showAll». Это было довольно неудобно в тех случаях, когда часть объектов фильма могла располагаться за пределами стандартной области. При этом изменение размеров окна плейера или браузера могло привести к их появлению на экране. Поэтому большим прорывом стало появление во Flash MX свойства scaleMode объекта Stage, которое дает возможность динамически задавать режим масштабирования.
Свойство scaleMode может принимать четыре значения, которые по написанию совпадают со значениями параметра (атрибута) scale тегов <Object> и <Embed>: «showAll» (величина, принятая по умолчанию), «noBorder», «exactFit», «noScale». Например, чтобы сделать фильм немасштабируемым, нужно набрать
Stage.scaleMode="noScale";
Переопределение свойства scaleMode сопровождается мгновенным переходом к новому режиму масштабирования. То есть в отличие от использования параметра (атрибута) scale тегов <Object> и <Embed>, свойство scaleMode дает возможность переходить от одного режима масштабирования к другому сколько угодно раз за время проигрывания фильма.
Если фильм опубликован на HTML-странице, то изначально режим масштабирования будет определяться значением параметра scale. Однако возможность использования свойства scaleMode при этом сохраняется, так что при необходимости к новому режиму можно перейти динамически в любой момент.
16.2.3. Типы выравнивания
Если используется режим масштабирования «showAll», то при изменении соотношения длин сторон окна плейера отображается область фильма, прилежащая к визуализируемой по умолчанию его части.
Представим, что окно было растянуто по горизонтали. Где будет отображена буферная зона? Ее с одинаковым успехом можно визуализировать слева, справа или сразу с обеих сторон основной области. Еще больше вариантов появляется, если окно плейера увеличивается при использовании режима масштабирования «noScale». При этом имеется девять вполне приемлемых вариантов того, в какой части окна плейера могла бы разместиться отображаемая по умолчанию область фильма. Столько же вариантов существует для обрезки фильма при уменьшении окна плейера.
Очевидно, что должна существовать характеристика, исходя из которой определялось бы, что именно должно отображаться в окне плейера после изменения его размеров. Несложно догадаться, что для устранения описанной выше неоднозначности нужно выделить в фильме некоторую точку и сделать ее неподвижной относительно границ окна плейера (т. е. выбрать точку симметрии).
Так как пропорции фильма сохраняются, то относительно неподвижной точки довольно просто рассчитать, какие объекты войдут в пределы окна плейера, а какие — нет. Например, если мы сде-

лаем неподвижной точку центра стандартной области фильма, то она будет отображаться в центре окна плейера независимо от того, как мы изменим его размеры. Следовательно, левую границу отображаемой части фильма можно определить, отняв от координаты центра фильма половину ширины окна плейера. Аналогичным образом можно вычислить положение остальных границ.
В принципе, точкой симметрии может быть любая точка фильма. Однако на практике количество потенциальных точек симметрии приемлемо ограничить девятью (четыре угла стандартно!! области фильма, четыре середины ее границ и точка центра). Возможность задавать, какая из этих точек будет использоваться в качестве опорной, появилась еще в первых версиях Flash. Правда, тогда эта возможность была доступна только для фильмов, опубликованных на HTML-странице. Ее носителем является параметр salign, прописываемый в теге <Object> (для тега <Embed> имеется одноименный атрибут). В качестве значения он может принимать указатель на одну из восьми точек, расположенных на границе стандартной области фильма.
То, какое значение соответствует какой точке, показано на рис. 16.5. Если параметр salign не определен, то в качестве точки симметрии используется точка центра фильма.
“T”
“LT” “RT”
“L” “R”
“LB” |
“B” |
“RB” |
|
|
Рис. 16.5. Точки, которые могут быть использованы в качестве опорных при масштабировании фильма
Если публикация HTM L-документа осуществляется из Flash, то выбрать подходящий режим вы-
равнивания можно в меню Flash Alignment закладки HTML окна Publish Settings.
Задание типа выравнивания при помощи параметра salign может быть использовано далеко не всегда. Во-первых, фильм может быть открыт браузером или плейером напрямую. Во-вторых, может понадобиться изменить тип выравнивания динамически. В этом случае нужно использовать свойство align объекта Stage, которое было введено в ActionScript во Flash MX.
Набор потенциальных значений у свойства Stage.align такой же, как у параметра salign (см. рис. 16,5). Их совсем несложно запомнить, если знать, что по-английски «верхний» — это top, «нижний» — bottom, «правый» — right, «левый» — left. Например, чтобы сделать опорной точкой правый нижний угол стандартной области фильма, нужно набрать
Stage.align="RB";
По умолчанию в качестве точки симметрии используется центр стандартной области фильма. Однако значения, которое бы соответствовало этой точке, у свойства align нет. Любая строка, отличная от «имен» остальных восьми точек, будет воспринята, как указатель на точку центра (именно поэтому изначально значением свойства align является пустая строка). Однако для определенности можно считать, что «именем» точки центра является «С» (от англ. center — центральный).
То, что мы увидим в результате масштабирования в окне плейера, очень сильно зависит от используемого типа выравнивания. На рис. 16.6 показано, как будет выглядеть фильм при масштабировании в режиме «noScale» с применением каждой опорной точки из девяти потенциально возможных.

Если фильм публикуется на HTML-странице, то тип выравнивания, используемый в фильме, будет зависеть от значения параметра salign тега <Object> (или соответствующего атрибута тега <Embed>). Однако при этом свойство Stage.align сохраняет работоспособность, поэтому тип выравнивания можно с легкостью изменить динамически.
Рис. 16.6. Возможные типы выравнивания
16.2.4. Определение размеров фильма и величины окна плейера
Стандартные размеры фильма определяются размерами рабочего поля среды разработки. По умолчанию оно представляет собой прямоугольник размером 550x400 пикселей. Изменить величину его сторон можно в окне Document Properties, открываемом кнопкой Size Инспектора Свойств. Ограничений на размеры сторон рабочего поля не существует.
Та часть фильма, которая входила при публикации в пределы рабочего поля, будет полностью отображаться тогда, когда размеры окна плейера будут совпадать со стандартными размерами фильма. Данный, казалось бы, частный случай наблюдается гораздо чаще остальных. Это связано как с тем, что при открытии фильма напрямую плейером окно последнего масштабируется под стандартные размеры фильма, так и с тем, что на HTML-странице SWF-фильм обычно публикуется исходя из своих стандартных размеров.
Однако важно понимать, что никакой жесткой привязки размеров окна плейера к размерам фильма нет. При таких режимах масштабирования, как «showAll» и «noScale» растяжение или сжатие окна плейера может привести к тому, что будут показаны области фильма, не входящие в зону, ограниченную его стандартными размерами. Наоборот, если используются режимы масштабирования «noBorder» и «noScale», то изменение размеров окна плейера может вызвать обрезку приграничных частей фильма, относящихся к отображаемой по умолчанию области.
Стандартные размеры фильма — это одна из его фундаментальных характеристик. Именно поэтому данные о них хранятся в заголовке SWF-файла. Невозможно динамически изменить стандартные размеры фильма. И до выхода Flash MX их нельзя было даже прочитать. Только в предпо-
следней версии Flash появились свойства width и height объекта Stage, позволяющие решать эту задачу.
Свойство Stage.width возвращает стандартную ширину, а Stage.height, соответственно, — стандартную высоту фильма в пикселях. Эти значения постоянные и не зависят от реальных размеров области фильма. Дело в том, что при изменении размеров окна плейера меняется масштаб фильма. Координаты же каждой точки фильма в абсолютном выражении остаются одними и теми же. Просто меняется расстояние, соответствующее единице измерения. Поэтому, например, стандартная ширина фильма, принятая по умолчанию, всегда будет равна 550 пикселей, даже если реально между левой и правой границами стандартной области фильма имеется всего 10 пикселей.
Если в плейере проигрывается несколько фильмов, то свойства Stage.width и Stage.height возвращают стандартные размеры фильма, располагающегося на нулевом уровне. Это связано с тем, что именно исходя из них задаются размеры окна плейера, принятые по умолчанию.
Свойства width и height объекта Stage обычно используются, если движение объекта должно происходить в пределах границ стандартной области фильма (или если нужно зарегистрировать пересечение объектом границы этой области). Мы с данными свойствами уже работали, когда создавали событие, возникающее при выходе указателя мыши за пределы фильма. Тогда нам нужно было нарисовать прозрачный прямоугольник, совпадающий с видимой областью фильма. Его ширина и высота определялись при помощи рассматриваемых свойств.
Сейчас же в качестве примера использования свойств width и height приведем код, управляющий движением упругого шарика. Когда этот шарик будет достигать границы стандартной области фильма, он будет от нее отражаться, как от жесткого препятствия.
//Создайте клип в виде шарика и назовите его ball
//Значение скорости вдоль каждой оси определяем случайным образом var xSpeed:Number=5*Math.random(); // Скорость вдоль оси X
var ySpeed:Number=5*Math.random(); // Скорость вдоль оси Y this.onEnterFrame=function():Void {
//Проверяем, достиг ли шарик границы по горизонтали. Если да, то изменяем
//направление скорости на противоположное
if (ball._x-ball._width/2<0 || ball._x+ball._width/2>Stage.width) { xSpeed*=-1;
}
//То же, но для границ по вертикали
if (ball._y-ball._height/2<0 || ball._y+ball._height/2>Stage.height) { ySpeed*=-1;
}
//Смещаем шарик на шаг ball._x+=xSpeed, ball._y+=ySpeed;
};
Созданный код работает весьма неплохо, но только до тех пор, пока размеры окна плейера не будут изменены. Если же в результате сжатия или растяжения окна начнет отображаться приграничная область (что возможно в режиме масштабирования «showAll»), то получится, что шарик отпрыгивает от пустоты.
Наоборот, если изменение размеров окна происходит в режиме масштабирования «noBorder», то часть стандартной области фильма окажется скрытой. В итоге шарик будет уходить за пределы видимой части фильма, что уничтожит сам смысл эффекта. Нельзя ли как-то определять реальные размеры отображаемой области? При этом совсем несложно было бы сделать эффект, не зависящим от размеров окна плейера.
Чтобы определить размеры окна плейера, предварительно нужно решить, какие единицы измерения будут использоваться. Это могут быть реальные пиксели экрана или же масштабированные пиксели, характерные для системы координат отображаемого фильма. В любом случае возникнут довольно существенные сложности с пересчетом одних координат в другие. Из-за этих сложно-
стей размеры окна плейера стоит определять лишь тогда, когда пиксели системы координат фильма будут совпадать с пикселями экрана. А это условие всегда соблюдается лишь в том случае, если используется режим масштабирования «noScale».
В режиме масштабирования «noScale» свойства width и height объекта Stage хранят ширину и высоту окна плейера в пикселях. В остальных же режимах масштабирования, как вы помните, данные свойства служат для определения стандартных размеров фильма. Это очень важная для практики особенность, которую нужно постараться запомнить.
Зная, при каких условиях мы можем определить размеры окна плейера, перепишем код эффекта так, чтобы шарик отпрыгивал от границ всегда. Это несложно сделать при любом типе выравнивания фильма. Мы будем создавать алгоритм, считая, что применяется выравнивание по центру (оно используется по умолчанию). Нетрудно догадаться, что при этом границы будут удалены от центра фильма на расстояния, равные половине ширины и высоты окна плейера.
Таким образом, чтобы узнать, достигли шарик данной границы, нужно сопоставить его координату с суммой (или разностью, в зависимости от того, какая это граница) соответствующей координаты центра фильма и половины ширины (высоты) окна плейера. Единственная сложность в том, как узнать координаты центра фильма, если в режиме масштабирования «noScale» свойства width и height объекта Stage возвращают ширину и высоту окна плейера, а не стандартные размеры фильма.
Решение данной проблемы очень простое. М ы можем определить ширину и высоту фильма в режиме масштабирования «showAll», записать полученные данные в переменные и лишь затем перейти к необходимому режиму «noScale».
Описанные выше идеи материализуются следующим кодом:
var mov_width:Number=Stage.width; |
// Ширина и высота фильма |
var mov_height:Number=Stage.height; |
// Переходим в нужный режим масштабирования |
Stage.scaleMode="noScale"; |
|
var xSpeed:Number=5*Math.random(); |
// Скорости по осям X и Y |
var ySpeed:Number=5*Math.random(); |
|
this.onEnterFrame=function() { |
|
// Проверяем, не пересечены ли правая и левая границы
if (ball._x-ball._width/2<mov_width/2-Stage.width/2 || ball._x+ball._width/2>mov_width/2+Stage.width/2) {
xSpeed*=-l;
}
// Проверяем, есть ли пересечение с верхней и нижней границами if (ball._y-ball._height/2<mov_height/2-Stage.height/2 ||
ball._y+ball._height/2>mov_beight/2+Stage.height/2) { ySpeed*=-1;
}
// Смещаем шарик ball._x+=xSpeed, ball._y+=ySpeed;
};
Созданный код работает вполне удовлетворительно. Независимо от того, как вы растянете или уменьшите окно плейера, шарик все равно будет отпрыгивать от его границ. Правда, сбой возникает, если в результате смешения границы окна шарик оказывается за пределами отображаемой части фильма. При этом он никогда в границы окна не вернется (так как его движение просто прекратится). Как можно справиться с этим недостатком эффекта, мы покажем чуть ниже, когда разберем событие onResize.
Можно ли изменить размеры окна плейера не «вручную», а динамически, при помощи ActionScript? Увы, напрямую это сделать невозможно. Однако используя побочные эффекты некоторых операций — вполне.
Не раз упоминалось, что размеры окна плейера по умолчанию зависят от стандартных размеров