
- •Оглавление
- •Вступление
- •Глава 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. Полезные мелочи
от контекста. Например, следующий код вводит в контекстное меню команду, которая делает в два раза большим элемент, который располагался под указателем мыши в момент щелчка. Причем имя элемента будет отображаться в строке команды:
var myMenu:ContextMenu = new ContextMenu();
Object.prototype.menu = myMenu; // Одно и то же контекстное меню будет
//соответствовать всем объектам
//В имя пункта будет входить идентификатор объекта, к которому относится
//меню
var myMenuItem:ContextMenuItem = new ContextMenuItem(null, func); myMenu.onSelect = function(obj):Void {
myMenuItem.caption = "Увеличить объект "+obj;
}; // В случае выбора созданной команды увеличиваем соответствующий объект
function func(obj):Void {
obj._xscale *= 2, obj._yscale *= 2;
}
myMenu.customItems.push(myMenuItem);
Настройка контекстного меню может быть осуществлена лишь до того, как оно будет отображено. Изменить какую-то его характеристику после того, как оно будет визуализировано, невозможно.
12.3. Работа с клавиатурой
Реагировать на нажатие определенных клавиш можно было еще в первых версиях Flash. Тогда носителем этой возможности было особое событие кнопок keyPress. Оно позволяло «отлавливать» нажатие клавиш символов, а также некоторых служебных клавиш. Пример:
on(keyPress "A") { trace("Клавиша А нажата");
}
Событие keyPress может быть использовано и во Flash MX 2004. Однако делать этого не стоит, так как еще во Flash 5 появились куда более мощные элементы, позволяющие обрабатывать нажатие кнопок клавиатуры. Их носителем является специальный встроенный объект Key. Ему присущи 2 события, 4 метода и 18 свойств. Рассмотрению их назначения будет посвящен данный раздел.
12.3.1. Особенности событий клавиатуры
Сообщения о нажатии или отпускании клавиш клавиатуры передаются в Flash-плейер лишь в том случае, если он находится в фокусе. Иначе — их получает активное в данный момент приложение. Конечно, это не может вызвать никаких затруднений, если фильм проигрывается в отдельном окне плейера. Сложности могут возникнуть, если swf-фильм встроен в HTML-страницу. При открытии такой страницы в фокусе будет находиться браузер, а не плейер. Соответственно поступать в фильм информация о нажатых клавишах не будет.
Решить описанную проблему можно двумя способами:
•Создать специальную кнопку, без нажатия которой фильм не начинал бы проигрываться. Щелкнув по этой кнопке, пользователь переведет фокус с браузера на плейер. Данный подход приемлем в случае игр,
•Перевести на фильм фокус можно и автоматически, используя метод focus() JavaScript. Данный способ оптимален в случае сайтов.
У Flash-плейера, как практически у любой программы, есть свои «горячие» клавиши и сочетания. Они управляют основными опциями плейера и дают команды проигрываемому фильму. Например, перевести фильм в полноэкранный режим можно, нажав <Ctrl> + <F>. Чтобы выйти из него, нужно задействовать клавишу <Еsс>, и т.д. При нажатии «горячей» клавиши или сочетания ин-
формация о том, что были задействованы определенные кнопки, в фильм не поступает. Так, если вы нажмете <Esc>, то события onKeyDown не будет. При нажатии <CtrI>+<F> будет зарегистрировано только опускание клавиши <Clrl>.
Если в фильме активно применяется управление с клавиатуры, то наличие «горячих» клавиш и сочетаний может быть нежелательным (например, клавишу <Esc> удобно использовать как закрывающую игру или презентацию). Чтобы отключить их поддержку, нужно набрать следующую строчку:
fscommand("trapallkeys", "true");
К сожалению, невозможно блокировать «горячие» сочетания операционной системы и браузера. Так, нажав <Alt> + <Tab>, вы сделаете активным окно другого открытого приложения. <АН> + <F4> закроет окно плейера. Нажатие <Таb> в случае встроенного в HTML-страницу фильма может привести к снятию с него фокуса. «Отловить» нажатие <Esc>, если фильм проигрывается в браузере, в принципе невозможно.
Ввиду того что отключить некоторые «горячие» сочетания нельзя, специальные кнопки лучше вообще не использовать в проектах. Особенно это касается клавиш <Ctrl> и <Таb>.
Собственные «горячие» сочетания и клавиши присущи и среде тестирования Flash. По этой причине, например, в ней невозможно произвести клавиатурный обход при помощи клавиши <Таb> или «отловить» нажатие <Esc>. Чтобы блокировать использование служебных клавиш и сочетаний, задействуйте настройку Disable Keyboards Shortcuts меню Control. Кстати, это единственный способ решить эту задачу, так как команды fscommand() в среде тестирования не действуют.
12.3.2. События onKeyDown и onKeyUp
Событие onKeyDown происходит при нажатии пользователем клавиши клавиатуры. Соответственно событие onKeyUp возникает, если клавиша отпускается. Чтобы некоторый объект получал сообщения о данных событиях, он должен быть добавлен в список листенеров объекта Key. Сделать это можно при помощи метода add List ener():
var obj:Object = {}; Key.addListener(obj);
// При нажатии любой кнопки сообщение появится в Output obj.onKeyDown = function():Void {
trace("Былa нажата кнопка");
};
Удалить объект из списка листенеров объекта Key можно, используя метод removeListener().
Модель событий Flash 5 не позволяла сделать генератором или листенером событий произвольный объект. Они тогда были присуши только клипам и кнопкам. События нажатия и отпускания клавиш клавиатуры «слушались» по умолчанию всеми клипами. Это же мы можем наблюдать и сейчас, создавая обработчики в стиле Flash 5:
onClipEvent(keyDown) { // При нажатия любей клавиши клип исчезнет this._visible=false;
}
Итак, при применении старой модели событий клипам изначально доступны события клавиатуры. Однако если использовать обработчики-методы, то окажется, что по умолчанию клипы не являются листенерами событий onKeyDown и onKeyUp;
this.createEmptyMovieClip("clip", 0);
// Нажатие клавиш не Судет сопровождаться появлением сообщения clip.onKeyDown = function():Void {
trace("Клавиша нажата!");
};
To, что одно и то же событие, но в разной форме записи, ведет себя по-разному, выглядит, по меньшей мере, странно. Особенно, если учитывать, что разработчики Flash стремились сделать две модели событий максимально схожими. Поэкспериментировав, можно обнаружить, что клипы все же могут «слушать» события onKeyDown и onKeyUp, но лишь в том случае, если они находятся в фокусе:
// Создаем клип с именем в виде кружочка
clip.focusEnabled = true; |
// |
Делаем клип выделяемым |
Selection.setFocus(clip); |
// |
Наводим на клип фокус |
// Нажатие кнопки приведет к увеличению клипа в два раза clip.onKeyDown = function():Void {
this._xscale = this._yscale *= 2;
}
Хотя в фокусе клипам доступны события onKeyDown и onKeyUp, вряд ли это может быть хоть как-то использовано на практике. И дело даже не в раздражающей желтой рамке, которая окружает выделенный клип — ее отображение с легкостью можно отключить. Просто фокус, даже если его навести на клип n нужный момент программно, используя метод setFocus() объекта Selection, может просто не успеть выполнить возложенные на него функции. При малейшем движении мыши он исчезнет. То же произойдет, если будет нажата кнопка мыши или клавиша пробела или ввода.
Поскольку клипам события onKeyDown и onKeyUp присущи только в исключительно редкой ситуации наличия фокуса, вполне можно считать, что они не являются листенерами данных событий. Поэтому, если необходимо, чтобы клип получал сообщения о событиях клавиатуры, он должен быть явно занесен в список листенеров объекта Key при помощи метода addListener(). To же самое справедливо и для кнопок (во Flash MX 2004 у них появились события onKeyDown и onKeyUp).
На первый взгляд, событие клавиатуры onKeyDown чрезвычайно схоже с событием мыши onMouseDown. Однако между ними имеется принципиальное отличие. Событие onMouseDown происходит один раз при нажатии левой кнопки мыши. При этом не имеет значения, была ли она отпущена сразу, или же удерживалась относительно продолжительное время. Событие же onKeyDown при удерживании клавиши будет повторяться с достаточно высокой частотой до тех пор, пока она не будет отпущена. Количество событий onKeyDown будет определяться настройками операционной системы пользователя и может в среднем составлять от 30 до 10 событий в секунду.
В том случае, если одновременно было нажато несколько клавиш, индивидуальные события onKeyDown и onKeyUp произойдут для каждой из них.
Используя события onKeyDown и onKeyUp, можно узнать лишь то, что какая-то из кнопок была нажата или отпущена. Какая же именно это была кнопка, определяется при помощи методов getCode() и getAscii() объекта Key. Их описание приведено ниже.
12.3.3. Определение кода нажатой клавиши. Метод getCode()
Подумаем, как могут адресоваться клавиши клавиатуры. Наверное, самый очевидный вариант — по вводимым ими символам. Например, если на кнопке нарисована буква «А», то ею и должна обозначаться эта клавиша. Однако такой подход порождает массу проблем. Как обозначать служебные клавиши, которым не соответствуют символы? Как учесть, что в разных странах одни и те же клавиши могут задавать разные символы? Что делать, если в разных раскладках кнопка вводит разные символы? Как учесть наличие числовой клавиатуры?
Очевидно, что адресация по вводимому клавишей символу не универсальна. Гораздо лучше дать каждой кнопке стандартный номер исходя из ее положения. А какой она будет задавать символ и

будет л и задавать вообще — это второстепенно.
ВWindows для каждой клавиши имеется стандартный код, присваиваемый ей исходя из ее физического расположения. Например, на стандартной клавиатуре клавиши с числами от 0 до 9 занимают интервал кодов от 48 до 57, клавиша <Enter> имеет номер 13, <Таb> — 9, <Ctrl> — 17. Интересно, что коды клавиш от А до Z и от 0 до 9 совпадают с занимаемыми ими позициями в кодировках семейства ASCII. Таблица с кодами всех клавиш приведена в конце данной книги.
ВActionScript определить код нажатой последней клавиши можно, используя метод getCode() объекта Key. Например:
Key.addListener(this);
// При нажатии <Enter> в Output будет выведено сообщение this.onKeyDown = function():Void {
if (Key.getCode() == 13) { trace("Клавиша <Enter> нажата");
}
};
Если клавиш нажато не было, метод getCode() возвращает 0.
Метод getCode() неразрывно связан с событиями onKeyDown и onKeyUp. Действительно, не имеет смысла применять его вне их обработчиков, так как он показывает, какая кнопка была задействована последней безо всякого лимита на отдаленность этого события.
Возвращаемое getCode() значение не зависит от того, какая раскладка или регистр были активны. Например, введению и латинской «F», и русской «а» будет соответствовать один код — 70. Если необходимо среагировать не на нажатие определенной клавиши, а на добавление конкретного символа, то нужно использовать метод getAscii().
По сравнению с методом getAscii(), у метода getCode() есть важные преимущества. Так, он позволяет определять нажатие не только клавиш символов, но и всех служебных клавиш. С его помощью можно различать, была ли задействована кнопка цифры или арифметической операции на основной или числовой клавиатуре. Метод getCode() интернационален: один и тот же код будет адресовать одну и ту же клавишу вне зависимости от того, какая кодовая страница используется компьютером пользователя. Также данный метод платформенно-независимый; при проигрывании фильма на машинах Macintosh коды клавиш будут автоматически переводиться в Windowsэквивалентные.
В число виртуальных клавиш Windows входят и кнопки мыши (им соответствуют коды 1 и 2). Однако определять факт их нажатия метод getCode() не может. Если существует подобная необходимость (например, нужно создать событие правого Щелчка), то воспользуйтесь методом isDown(),
Чтобы разработчикам приходилось реже обращаться к таблицам с виртуальными кодами кнопок, у объекта Key имеется группа свойств, хранящих колы наиболее важных служебных клавиш. Имена этих свойств совпадают с названиями адресуемых ими кнопок. Поэтому отдельно описывать каждое из них не имеет смысла, и мы ограничимся простым их перечислением (табл. 12.1).
|
Свойства объекта Key |
Таблица 12.1 |
||
|
Хранимый код |
|
||
Имя свойства |
Хранимый код |
Имя свойства |
|
|
BACKSPACE |
8 |
INSERT |
45 |
|
CAPSLOCK |
20 |
LEFT |
37 |
|
CONTROL |
17 |
PGDN |
34 |
|
DELETEK.EY |
46 |
PGUP |
33 |
|
DOWN |
40 |
RIGHT |
39 |
|