
- •Оглавление
- •Вступление
- •Глава 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. Полезные мелочи

Глава 7
Массивы (класс Array)
Массив (Array) — это объект особого типа данных, имеющегося во всех языках программирования высокого уровня. Он представляет собой упорядоченную совокупность объектов данных, рассматриваемую как единое целое. В ActionScript не существует массивов как объектов отдельного типа данных. Массивы в нем являются обычными объектами типа object, относящимися к классу Array. По целому ряду причин (которые мы обсудим в разделе 7.13) массивы ActionScript не являются полноценными массивами в принятом в программировании понимании. Однако все отличия между массивами ActionScript и, например, Java касаются особенностей реализации, по форме же использования и назначению они абсолютно идентичны. Поэтому во многих книгах по ActionScript объекты класса Array относят к отдельному типу данных.
Понятие «массив» в программировании идентично понятию «матрица» в математике. Так как массивы ActionScript одномерны, то им соответствуют векторы (матрицы-столбцы). Адресация элементов в матрице осуществляется при помощи целочисленных индексов. Аналогичным образом индексируются и элементы массива. Первый его элемент является свойством с именем «0», второй
— с именем «1» и т. д. Отсчет элементов от 0, а не от 1 может показаться странным людям, не знакомым с программированием. Однако именно с нуля начинается индексирование в большинстве языков, что связано с тем, что 0 — это наименьшее двоичное число.
Элементами массива ActionScript могут быть любые объекты данных: числа, строки, объекты или массивы. В принципе, элемент массива по своим особенностям практически полностью соответствует переменной. Поэтому массив можно, упрощая, считать совокупностью переменных.
Если вы новичок в программировании, то представьте массив в виде шкафа с определенным числом полок. Полки последовательно пронумерованы, и каждая изних может хранить некоторый предмет. Чтобы извлечь нужный предмет, совсем не обязательно помнить его название. Достаточно знать, на какой он полке лежит. Схема массива arr, хранящего в качестве элементов число 3, объект obj, строку «Привет» и клип mov, приведена на рис. 7.1.
|
Массивы незаменимы тогда, когда возникает потребность в хра- |
|
нении и обработке нескольких (или большого числа) схожих |
|
объектов данных. С массивами мы уже встречались в двух пре- |
|
дыдущих проектах. В этой главе мы дополним имеющиеся прак- |
|
тические навыки необходимыми теоретическими познаниями. |
Рис. 7.1. Схема массива |
7.1. Создание массивов |
Массивы являются объектами класса Array. Поэтому создать их, как и объекты любых других классов, можно, используя функцию-конструктор и ключевое слово new:
var arr:Array=new Array[]; // Код создает пустой массив
Особенностью функции Аггау() является то, что она возвращает массив, даже если оператор new и не был задействован. По этой причине в словаре ActionScript она отнесена к функциями преобразования типа данных, хотя таковой реально не является.
var arr:Array=Array[); |
// Ключевое слово new не используется |
|
trace(arr instanceof Array}; |
// |
Выводит: true (arr является объектом |
|
// |
класса Array) |
Если элементы массива известны в момент его создания и число их невелико, то они могут быть
прописаны в качестве параметров конструктора Аггау(). Последовательность их задания будет сохранена. Например:
var arr:Array=new Array(1,2,3,4,5); trace(arr); // Выводит: 1, 2, 3, 4, 5
Так как оператор «,» обладает самым низким приоритетом среди операторов ActionScript, то параметром конструктора Аггау() может быть целое выражение: оно вычислится до того, как интерпретатор перейдет к рассмотрению следующего аргумента.
Число элементов массива практически не ограничено. Максимальное их количество составляет 4 294 967 296 (232). Вряд ли можно придумать задачу, в которой лимит на число элементов массива оказался бы превышен, Да и такие ограничители, как предельное время выполнения кода и объем отведенной оперативной памяти, не позволят вам достичь даже сотой части из возможных четырех миллиардов элементов.
Конструктор Аггау() имеет и альтернативный описанному выше синтаксис. Если в качестве параметра ему передано только одно целое положительное число N, то он создает массив из N пустых элементов (реально элементы созданы не будут — просто произойдет присваивание свойству length массива значения N):
var arr:Array=new Array(5);
trace (arr); // Выводит: undefined,undefined,undefined,undefined,undefined
To, что конструктор Аггау() имеет два варианта задания параметров, означает, что вы не можете создать массив с единственным элементом, если он является числом. Чтобы это сделать, нужно использовать литерал массива или же задать значение элемента отдельно от объявления массива.
На практике массивы редко создаются при помоши конструктора Аггау(). Гораздо чаще для этого используются литералы массивов, формируемые при помощи специального инициализатора «[]». Список элементов в этом случае должен быть прописан внутри квадратных скобок точно так же, как и при создании массива с использованием конструктора Аrrау(). Например:
var arr:Array=[l,2,3,4,5]; // |
Создаем литерал массива |
tracetarr instanceof Array); // |
Выводит: true (arr действительно является |
// |
объектом класса Array) |
trace(arr); // Выводит: 1, 2, 3, 4, 5
В отличие от конструктора Аrrау(), если в литерале массива имеется только один элемент и он является числом, то массив из пустых элементов соответствующей ему длины создан не будет:
trace([5]); // Выводит: 5
В качестве элементов списка внутри литерала массива могут использоваться не только литералы и идентификаторы, но и любые выражения. При формировании массива они будут автоматически вычислены:
var arr:Array=[2*2, Math.random(), "При"+"вет"]; trace(arr); // Выводит: 4, 0.764446393121034, Привет
7.2. Извлечение и переопределение элементов массива
Прочитать значение объекта класса Array можно точно так же, как и величину свойства объекта любого другого класса: используя оператор доступа к свойствам. Так как индексы массивов являются числами, то применить для решения этой задачи оператор «.» нельзя (он требует задания имени свойства в виде идентификатора, а идентификатор не может начинаться с цифры). Прочитать значение элемента массива можно, применив оператор доступа к свойствам по строковым ключам «[]». Например:
var arr:Array=["Привет","Пока"];
trace(arr[0]); // Выводит: Привет (индекс задан в виде числа) trace(arr["1")); // Выводит: Пока (индекс задан в виде строки)
Как видно из приведенного примера, нет никакой разницы в том, в строковом или в численном виде представлен индекс элемента, Это связано с тем, что в любом случае алгоритмом оператора «[]» проводится преобразование типа переданного операнда к строковому типу. Немного позже мы покажем, что индексы массивов являются точно такими же свойствами объектов, как и любые другие — и все различие заключается в том, что их имена образованы символами цифр.
В качестве операнда оператора «[]» может быть использован не только литерал, но и некоторое выражение, результатом вычисления которого является целое число или строка из цифр:
var arr:Array=[l,2,3];
trace(arr[Math.sin(Math.PI/2)]); // Выводит: 2 (sin<90°) =0)
При обращении к несуществующему элементу массива результатом будет undefined.
Переопределить элемент массива, как и любое другое свойство объекта, можно, используя оператор «=» (или другой оператор присваивания):
var arr:Array=[l,2,3]; arr [1]="Привет";
trace(arr); // Выводит: 1, "Привет", 3
В отличие от большинства языков программирования, длина массива в ActionScript не фиксируется при его определении. Поэтому создать массив можно и поэлементно:
var arr:Array=[]; |
// Создаем пустой массив |
|
агг[0]=1; |
// в массиве 1 |
элемент |
агг[1]=2; |
// в массиве 2 |
элемента |
trace (arr); |
// Выводит: 1, |
2 |
Так как массив является обычным объектом, то его свойства могут иметь вид не только целочисленных индексов, но и адресоваться совершенно любыми строками. Например:
var arr:Array=[l,2]; |
// |
Присваиваем массиву arr свойство property |
arr.property=3; |
||
trace(arr); |
// |
Выводит: 1, 2 (трассируются только свойства-индексы) |
trace(arr-property); // |
Выводит: 3 |
Принципиальных отличий между свойствами-индексами и простыми свойствами не существует. Они проявляются только в том, что методы и свойства класса Array работают со свойствамииндексами, игнорируя остальные свойства массива.
7.3. Длина массива. Свойство length
Длина массива — это число его элементов. В ActionScript узнать, сколько элементов содержит массив, можно, используя свойство length класса Array:
var arr:Array=[l,2,3]; trace(arr.length); // Выводит: 3
Если массив не содержит элементов, то его длина равна 0.
Так как отсчет элементов массива ведется с 0, то его длина будет всегда на единицу больше индекса последнего элемента. Это нужно учитывать при использовании свойства length в расчетах.
В отличие от массивов таких языков, как С или Pascal, массивы ActionScript не требуют задания
длины при их создании. Длина массивов может динамически меняться в процессе работы сценария. Модифицироваться при этом будет и свойство length:
var arr :Array= [1, 2, 3]; // |
Массив из трех элементов |
|
rr[5J=6; |
// |
Добавляем элемент с индексом 5 |
race(arr.length); |
// |
Выводит: 6 (промежуточные элементы были созданы |
trace(arr); |
// |
автоматически) |
// |
выводит: 1, 2, 3, undefined, undefined, 6 |
Приведенный пример иллюстрирует интересную особенность, связанную с добавлением в массив нового элемента. Мало того, что при этом меняется длина массива, но и, если новый элемент не примыкает вплотную к последнему элементу массива, все промежуточные элементы создаются автоматически со значением undefined. Впрочем, стоит проверить, действительно ли все происходит именно так. Для этого перечислим все реально существующие элементы массива при по-моши
цикла for—in:
var arr:Array = [1, 2, 3]; arr[5] = 6;
for (var i in arr) {
trace(); // Выводит: 5, 2, 1, 0
}
Проведенная проверка показала, что наше предположение оказалось неверным. Промежуточные элементы не создаются автоматически. Они просто физически не существуют — поэтому при обращении к ним возвращается undefined. Полученный же при трассировке результат связан с тем, что алгоритм, переводящий массив в строку, опирается не на реально имеющиеся элементы, а на свойство length.
В отличие от свойства length класса String, свойство length класса Array может быть переопределено. При этом, если новое его значение превышает количество элементов в массиве, то в коней массива будут добавлены новые элементы со значением undefined (вернее, создастся иллюзия этого в результате изменения длины массива). Если же length присваивается значение, меньшее количества реально имеющихся в массиве элементов, то все лишние элементы будут удалены:
var arr:Array=[l,2,3);
arr.length=5; // Увеличиваем длину массива на два элемента
trace(arr); |
// |
Выводит: 1, 2, 3, undefined, undefined ("создано" два |
|
// |
элемента со значением undefined) |
arr.length=l; // |
Уменьшаем длину массива до одного элемента |
|
trace(arr); |
// |
Выводит: 1 |
Как уже указывалось выше, массивы ActionScript являются обычными объектами их элементы — это просто свойства, имена которых образованы цифрами. Однако это не означает, что свойство length учитывает все свойства массива. Наоборот, элементом массива считается только свойство, имеющее вид целого числа:
var arr:Array=[1,2,3); |
// |
Создаем массив из грех элементов |
|
arr.рrореrty="Привет!"; // |
Добавляем к массиву свойство |
||
trace(arr.length); |
// |
Выводит: |
3 (наличие свойства никак не повлияло |
|
// |
на длину |
массива) |
На практике свойство length обычно используется, если в цикле необходимо просмотреть все элементы массива. Кроме того, оно может быть полезно, если элемент должен быть добавлен в конец массива или же если некоторое действие должно быть выполнено при определенной длине массива.
7.4. Добавление элементов в массив
Существует несколько типов задач, связанных с добавлением в массив элементов — и каждая из них имеет индивидуальные методы решения. Перечислим эти задачи:
•элемент или группу элементов нужно добавить в начало массива;
•элемент или группу элементов нужно добавить в конец массива;
•элемент или группу элементов нужно вставить в середину массива.
Наиболее просто (ввиду отсутствия альтернатив) решается первая задача. Для того чтобы добавить в начало массива элемент или группу элементов, нужно использовать метод unshift(). Его синтаксис:
myArray.unshift (valuel, value2... valueN),
где:
•myArray — массив, в который должны быть добавлены элементы;
•value1, value2, …, valueN – Список элементов в том порядке, в котором их необходимо
присоединить к массиву.
Записав результат добавления элементов в массив в переменной myArray, метод unshiftO возвращает значение длины полученного массива.
Пример использования метода unshift():
var arr:Array=[l,2,3];
trace(arr.unshift(-2,-l,0)); // Выводи: 6 (длина массива arr
// после добавления трех элементов) trace(arr); // Выводит: -2, -1, 0, 1, 2, 3
Из трех рассматриваемых в этом разделе задач наиболее важна для практики та, которая связана с добавлением элемента или группы элементов в конец массива. Она имеет целых три способа решения.
Если к массиву должен быть присоединен только один элемент, то наиболее рационально сделать это, не обращаясь к специальным методам класса Array, а добавив его напрямую, по индексу. Например:
var arr:Array=[l,2,3]; arr[arr.length)=arr.length+1; trace(arr); // Выводит: 1, 2, 3, 4
Если в конец массива требуется добавить несколько элементов, то лучше всего применить метод push(). Его синтаксис и возвращаемое им значение точно такие же, как и у рассмотренного ранее метода unshift(). Пример:
var arr:Array=[l,2,3]; |
|
Выводит: 6 (длина массива |
trace(arr.push(4,5,6)); // |
||
trace(arr); |
// |
после добавления элементов) |
// |
Выводит: 1, 2, 3, 4, 5, 6 |
Чтобы добавить элемент или группу элементов в середину массива, нужно использовать метод splice(). Его синтаксис:
myArray.splice(start, deleteCcunt, valueO, value1...valueN),
где:
•myArray — модифицируемый массив;
•start — индекс элемента, с которого должна начаться вставка элементов или же удаление уча-
стка массива;
• deleteCount — число элементов массива, которые должны быть удалены, начиная от элемента