След не остается |
Интерфейсы AсtionScript
Введение в события и управляющие элементы
Одним из наиболее важных изменений во Flash MX является новая модель поддержки событий. Она полностью изменяет представление о способе кодирования анимации и взаимодействия с клавиатурой и мышью. Вы уже кое-что узнали об этом из нашей книги, рассмотрим теперь эту тему подробнее.
Мы рассмотрим несколько важных событий, которые имеют отношение к анимации и интерактивности и представляют хорошую модель для структуры фильма, основанной на коде. Мы также рассмотрим некоторые связанные с этим возможности, такие как setInterval и watches.
Основные определения
Событие - это что-то, что происходит в фильме во время его выполнения. Определенные объекты в фильме могут воспринимать эти события и реагировать на них. Чаще всего применяются события, которые происходят при возникновении нового кадра в фильме, движении мыши, нажатии кнопки мыши или клавиши.
Управляющий элемент события (или управляющий метод события) - это функция, которая выполняется при возникновении определенного события.
Приемник - это объект, который может воспринимать и обрабатывать определенные типы событий с управляющим элементом событий.
Рассмотрим в качестве примера onEnterFrame. Сначала создадим фильм - ничего экстраординарного, просто небольшую фигуру. Назовем его mc1_mc. Теперь мы должны убедиться, что фильм по умолчанию является приемником события enterFrame. Каждый раз при переходе Flash к новому кадру происходит событие enterFrame, и наш mc1_mc должным образом информируется об этом факте. В данный момент это не имеет большого значения, так как мы не определили управляющий элемент события для его обработки, но он предупрежден о событии и готов приступить к действиям, если мы дадим соответствующую команду.
Теперь определим функцию для управляющего элемента. Введите этот код в кадр 1 фильма.
function move() { this._x++; }
Сейчас это просто функция с именем move. Она берет какой-либо объект, вызывает эту функцию и перемещает его на один пиксель вправо. Функция довольно проста. Теперь присвоим эту функцию управляющему элементу onEnterFrame фильма mc1_mc.
mc1_mc.onEnterFrame = move;
Обратите внимание на ключевое слово this в коде выше. Когда вы используете параметр или переменную саму по себе (без пути), подразумевается, что он (она) принадлежит текущей временной диаграмме. Если опустить выражение this в этом блоке кода, _x примет значение _root._x, и наша функция переместит не mc1_mc, а весь фильм целиком!
При указании выражения this в функции идет ссылка на всякий объект, вызывающий эту функцию. В данном случае фильм mc1_mc вызывает функцию move, поэтому this._x переходит к mc1_mc._х, что нам и требуется.
При выполнении этого кода mc1_mc обнаруживает событие enterFrame в начале каждого нового кадра, которое вызывает его метод onEnterFrame (теперь - функция move () ). В результате фильм медленно скользит поперек рабочего места.
Об этом уже говорилось в данной книге, но теперь мы рассмотрим все более подробно. При определении переменной, например, name="Keith", Flash отводит место в памяти вашего компьютера и помещает туда значение "Keith". Если вы ранее присваивали значение, к примеру, name="Todd", то оно будет заменено в памяти новым значением. Аналогичный процесс происходит при определении функции.
Когда мы пишем
function move() { this._x++; }
Flash отводит место в памяти для хранения всех команд, содержащихся в функции. Если вы дополните команду move() двумя скобками, Flash перейдет в это местоположение в памяти и выполнит все выражения, которые там будут обнаружены. Хотя это и очевидно, но насколько известно, при поддержке событий достаточно важно то обстоятельство, что имя функции без скобок тоже несет в себе определенный смысл.
Имя функции само по себе может восприниматься как переменная, которая содержит адрес функции в памяти. Вы можете себе представить почтовое отделение, на стене которого подвешены небольшие металлические почтовые ящики. Каждый из них имеет свой номер, который говорит о положении ящика, и некоторое содержимое, т.е. почту. Имя функции можно сравнить со стопкой бумаги с номером ящика на ней. Этот номер означает, где находится ваша функция. С технической точки зрения это значит, что переменная move содержит ссылку на функцию. Вы можете присвоить переменной значение и затем передать это значение другой переменной, и точно так же вы можете передавать ссылки функции. Давайте рассмотрим следующий код:
function hello() { trace("hi there"); }