Пример API рисования: наглядный алгоритмический генератор

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

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

  • использование API рисования для создания основной фигуры с динамическими свойствами;

  • подключение пользователя к свойствам, используемым при рисовании;

  • перемещение анимации путем очищения рабочей области каждого кадра и последующей перерисовки.

В примере из предыдущего подраздела показана анимация «спутника», выполненная с помощью события Event.ENTER_FRAME. Этот пример расширяет предыдущий пример, отображая панель управления с набором ползунков, которые немедленно обновляют отображение нескольких спутников. В данном примере представлена формализация кода во внешние классы и объединение процесса создания спутника в цикл с сохранением ссылки на каждый спутник в массиве satellites.

Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы с образцами приложения находятся в папке Samples/AlgorithmicVisualGenerator. Папка содержит следующие файлы.

File

Описание

AlgorithmicVisualGenerator.fla

Основной файл приложения в Flash Professional (FLA).

com/example/programmingas3/algorithmic/AlgorithmicVisualGenerator.as

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

com/example/programmingas3/algorithmic/ControlPanel.as

Класс, управляющий использованием нескольких ползунков и отправляющий возникающие события.

com/example/programmingas3/algorithmic/Satellite.as

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

Установка прослушивателей

Сначала приложение создает три прослушивателя. Первый прослушивает отправленное с панели управления событие о необходимости обновления спутников. Второй прослушивает изменения размера рабочей области SWF-файла. Третий прослушивает каждый проходящий кадр SWF-файла, используя для перерисовки функцию doEveryFrame().

Создание спутников

По окончании установки прослушивателей, вызывается функция build(). Эта функция сначала вызывает функцию clear(), очищающую массив satellites и удаляющую все предыдущие рисунки из рабочей области. Это необходимо, т.к. функция build() вызывается повторно всякий раз, когда с панели управления отсылается событие о необходимости выполнения этого действия, например, при изменении настроек цветов. В этом случае спутники необходимо удалить и создать заново.

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

По окончании создания к каждому спутнику в массиве satellites добавляется ссылка. Вызов функции doEveryFrame() обновляет все спутники в данном массиве.

Обновление позиции спутника

Функция doEveryFrame() является основной для процесса анимации приложения. Она вызывается для каждого кадра с коэффициентом, равным коэффициенту кадров SWF-файла. Так как переменные рисунка меняются незначительно, у пользователя возникает ощущение просмотра анимации.

Эта функция сначала удаляет все предыдущие рисунки и перерисовывает фон. Затем она объединяет в цикл все контейнеры спутников, увеличивает для каждого спутника значение свойства position, а также обновляет свойства radius и orbitRadius, которые можно изменить с помощью панели управления. Наконец, с помощью вызова метода draw() класса Satellite выполняется обновление спутника и его перемещение на новую позицию.

Следует отметить, что счетчик i увеличивает значения только до переменной visibleSatellites. Это происходит по той причине, что когда пользователь с панели управления ограничивает число отображаемых спутников, оставшиеся в цикле спутники не должны повторно создаваться, а вместо этого должны быть скрыты. Это происходит в цикле, идущем сразу же после цикла, отвечающего за рисование.

По завершении выполнения функции doEveryFrame() происходит обновление числа visibleSatellites на всем экране.

Ответная реакция на действия пользователя

Пользователь взаимодействует с системой через панель управления, управляемую классом ControlPanel. Данный класс устанавливает прослушиватель вместе с индивидуальным для каждого ползунка минимальным, максимальным значением, а также значением по умолчанию. При перемещении пользователем этих ползунков вызывается функция changeSetting(). Эта функция обновляет свойства панели управления. Если для изменения требуется повторное создание отображения, отправляется событие, которое впоследствии обрабатывается в основном файле приложения. Как только настройки панели управления изменены, функция doEveryFrame() создает каждый спутник с применением обновленных переменных.

Дальнейшие настройки

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

  • С помощью функции doEveryFrame() можно увеличить значение цвета спутника.

  • С помощью функции doEveryFrame() можно уменьшить или увеличить радиус спутника.

  • Не обязательно, чтобы радиус спутника имел форму окружности; например, для перемещения в соответствии с синусоидальной волной может использоваться класс Math.

  • Спутники могут использовать функцию определения столкновений с другими спутниками.

API рисования можно использовать в качестве варианта для создания визуальных эффектов в среде разработок Flash, а также для создания базовых фигур во время выполнения. Его также можно использовать для создания многочисленных визуальных эффектов, которые невозможно создать вручную. Благодаря использованию API рисования и математики пользователь ActionScript обладает всем для реализации большоего количества неожиданных и оригинальных идей.