Опубликован: 07.11.2006 | Уровень: специалист | Доступ: платный
Лекция 7:

Интерфейсы AсtionScript

Аннотация: В этой лекции описана новая модель поддержки событий во Flash MX, также рассказано об интересных командах setInterval и watches.

Введение в события и управляющие элементы

Внимание! Для работы с этой лекцией необходимы учебные файлы, которые Вы можете загрузить здесь.

Одним из наиболее важных изменений во 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");
}

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip? 

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989