Создание, изменение и удаление методов-обработчиков

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

clip_mc.onEnterFrame = function() {

this._x+=10; //при нажатии клип перемещается горизонтально

}

Можно создать именованную функцию и присвоить ее имя методу‑обработчику.

function horizont _move() { this._x+=10; }

clip_mc.onEnterFrame = horizont _move;

Именованная функция может ссылаться на вызвавший ее объект через ссылку this.

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

delete clip.onEnterFrame;

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

Задание 1

1. Создать новый Flash-документ.

2. На первом кадре единственного слоя поместить следующий код:

var n:Number; 

_root.onEnterFrame=function(){

n++;

 trace("вызов №"+n);

}

3. Протестировать флеш. Хотя флеш состоит всего из одного кадра и не содержит анимации, событие onEnterFrame наступает с указанной частотой смены кадров.

Задание 2

1. Переименовать слой Layer 1 в Actions

2. Создать новый слой с именем Clip.

3. Нарисовать на единственном кадре нового слоя вытянутый эллипс и преобразовать его в символ MovieClip. Дать экземпляру имя clip_mc.

 

 

4. Закомментировать старый обработчик _root.onEnterFrame. Создать обработчик для clip, который заставит clip непрерывно вращаться.

5. Создать кнопку, нажатие которой прекращает вращение clip_mc.

6. Протестировать флеш.

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

 start_btn.onPress=function(){

clip.onEnterFrame= function(){this._rotation+=10;} }

Но если обработчику присваивалась ссылка на именованную функцию, то достаточно заново присвоить только ссылку.

start_btn.onPress=function(){

clip.onEnterFrame= func_name;

}

Если обработчику onEnterFrame присвоить имя другой функции, то clip будет выполнять другую анимацию.

Задание 3

1. Создать новый флеш-документ.

2. Создать два слоя с именами Actions и Clip.

3. Создать символ в виде вытянутого эллипса.

В слое Clip разместить экземпляр символа и три кнопки.

 При нажатии кнопки rotate символ начинает непрерывно вращаться. При нажатии кнопки move символ начинает перемещаться вправо на расстояние не более 100, при достижении предельной точки начинает двигаться влево и т.д. Кнопка stop прекращает всякое движение.

Функция setInterval

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

Функция setInterval() позволяет осуществлять периодические вызовы функции или метода, причем период вызовов можно задавать произвольно и он может иметь разные значения для разных функций и методов. Ее использование для периодического вызова функции имеет следующий синтаксис:

setInterval(func, time, [ param1, param2,..., paramN ]) где:► func – имя функции, которая должна периодически вызываться. ► time — период времени, через который должна вызываться функция; ► [param1, param2,..., paramN ] — необязательные параметры для передачи возможных аргументов функции func.

Имя вызываемой функции не должно заключаться в кавычки.

Интервал time измеряется в миллисекундах. Значение time=1000 соответствует одному вызову в секунду. Среда Flash вызывает функцию по возможности ближе к заданному интервалу, но возможны отклонения. На точность вызовов влияет работа самого компьютера (точность отсчета интервала) и другие факторы (вызов функции должен ждать завершения текущих операций и т.д.).

Задание №4

1. Создать новый Flash-документ.

2. В окне Actions ввести следующий код

function test(){ trace(getTimer());}

ID=setInterval(test,100);

3. Протестировать при частоте смены кадров 12 fps, 10fps и 1fps.

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

Если функция setInterval() должна вызываться "короткую" функцию, то последнюю можно определить при вызове setInterval:

setInterval(function(par){trace(par);},100,"Hello!!!");

Функция setInterval() имеет иной синтаксис для периодического вызова метода объекта

setInterval(objRef:Object, methodName:String,

interval:Number,   

    [ param1, param2,..., paramN ]): Number)

где:

objRef имя объекта или ссылка на него (не строка!);

methodName имя метода в виде строки;

interval интервал времени, через который метод должен вызываться;

[ param1, param2,..., paramN ] — параметры, передаваемые методу.

Задание №5

1. Создать новый Flash-документ.

2. Создать в нем два слоя с именами Actions и Clip.

3. Создать символ в виде подсвеченного шарика и поместить его экземпляр c именем clip на слой Clip.

 

4. При щелчке мышки объект clip должен постепенно двигаться по направлению к указателю мышки. Для программирования данного действия описать следующие переменные уровня основной временной шкалы

· Xstart и Ystart — координаты clip в момент щелчка мышки,

·  targetX и targetY — координаты положение мышки.

· k — угловой коэффициент прямой, по которой происходит движение.

· Dx=2*(targetX-Xstart)/Math.abs(targetX-Xstart) — шаг изменения х.

Метод moveToMouse осуществляет перемещение шарика по направления к (Xstart;Ystart) на один шаг.

Написать обработчик clip.onMouseDown, в котором эти параметры вычисляются и вызывается функция setInterval для метода moveToMouse объекта clip c интервалом 100.

ID=setInterval(this,"moveToMouse",100);

Обратите внимание, что при вызове при помощи setInterval() метода объекта имя метода должно быть представлено строго в строковом виде, имя объекта — в виде идентификатора.

5. После события MouseDown начинаются периодические вызовы функции moveToMouse, являющейся методом объекта clip

clip. moveToMouse = function() {

this._x += Dx; //задаем изменение координаты x

this._y =…; } // вычисляем координату y

6. Протестировать флеш.

В созданном фильме шарик непрерывно двигается по направлению указателя мышки в момент щелчка и не останавливается, достигнув его.

Поэтому надо дописать функцию проверки конца движения. Если координаты clip по абсолютной величине достаточно близки к запомненным координатам мышки в момент щелчка, последовательность вызовов метода moveToMouse надо прекратить.

Работу setInterval() прерывает функция clearInterval(), принимающая в качестве параметра порядковый номер последовательности вызовов, возвращенный setInterval().

ID=setInterval(this,"moveToMouse",100);  

clearInterval(ID);

Задание №6

Доработать флеш, чтобы шарик останавливался.

Обновление экрана

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

for(var i=1; i<=100; i++) this._x+=1;

будет не плавное перемещение клипа вправо, а резкий скачок сразу на 100 пикселов.

Если частота смены кадров 1fps (интервал времени между кадрами 1000 миллисекунд) а значение интервала у функции setInterval() 100 миллисекунд,

setInterval(func,100);

то на экране будет отображаться результат 10 последовательных вызовов функции func. При такой частоте смены кадров объект clip будет двигаться скачками.

Немедленное обновление экрана вызывает глобальная функция updateAfterEvent(). Использовать ее можно быть только в функциях, вызываемых setInterval, и обработчиках событий. При размещении в других местах updateAfterEvent() просто игнорируется системой.

Задание №7

Добавить во флеш обновление экрана после каждого перемещения шарика.

Задание №8

Создать аналогичный флеш, но с использованием обработчика onEnterFrame.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: