Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ActionScript 2.0 ЛР.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.88 Mб
Скачать

Типы функций

Функции, так же, как и переменные, бывают трех типов:

  • функции временной шкалы (функции клипа), которые связаны с клипом и могут рассматриваться как его методы;

  • глобальные функции, которые можно использовать без указания адреса из любого места в программе;

  • локальные функции, которые объявляются внутри другой функции.

Чаще всего используют функции клипов. Например, если в одном из кадров главной временной шкалы объявлена функция

function qq () { ... }

с другой временной шкалы (из обработчика другого клипа) она вызывается как _root.qq().

Ту же функцию можно объявить по-другому:

qq = function() { ... }

При этом фактически создается переменная типа «ссылка на функцию» и в нее записывается адрес кода.

Глобальные функции объявляются с помощью слова _global:

_global.qq = function ( x ) { ... }

Эту функцию можно вызывать просто как qq() из любого места программы, в том числе из обработчиков событий клипов.

Локальные функции объявляются внутри другой функции и известны только там. В примере

trace(b);

a();

function a() {

function b() {}

trace(b);

}

функция b — локальная для функции a, поэтому первый вызов trace(b) даст результат undefined (не определено), а второй (изнутри функции a) — [type Function], то есть, найдена функция с таким именем.

Обработчики событий

Обработчики событий — это специальные методы кнопок и клипов. Например, вместо определения обработчика события on(release) можно записать адрес нужной функции в свойство onRelease кнопки или клипа.

Пусть на текущем монтажном столе есть кнопка с именем btn (имя кнопки задается в левой части на панели Properties). Разберем такой код:

btn.onRelease = function () {

trace("q");

btn.onRelease = second;

}

function second() {

trace("qq");

btn.onRelease = null;

}

Вначале обработчик события кнопки — это безымянная функция, которая выводит на экран букву q и, кроме этого, меняет обработчик события на адрес функции second.

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

Теперь займемся нашим начатым фильмом. Нужно учесть следующее:

  • клипы, загруженные с диска на уровни 1 2 и 3, нужно расположить точно в том месте, где находится синий экран телевизора;

  • переключатели каналов работают только тогда, когда включено питание;

  • при выключении телевизор запоминает канал, работавший в этот момент.

Таким образом, к объекту Телевизор (имя tv) нужно добавить свойства-переменные:

  • power — логическое значение, показывающее, включено ли напряжение;

  • channel — номер ключенного канала;

  • screenX и screenY — координаты левого верхнего угла экрана.

Учтем, что экран телевизора — это клип, имеющий имя screen (в левой части панели Properties).

  1. Выделите клип-телевизор и добавьте к нему обработчик

onClipEvent ( load ) {

power = false;

channel = 1;

var p = new Object();

p.x = screen._x;

p.y = screen._y;

localToGlobal ( p );

screenX = p.x;

screenY = p.y;

}

В самом начале питание отключено и установлен первый канал. Для размещения новых клипов на экране нужны его глобальные координаты (относительно всего окна, а не клипа-телевизора). Для использования функции localToGlobal создается новый объект p, к нему добавляются свойства x и y, равные локальным координатам экрана.

Теперь создадим обработчик кнопки включения питания.

  1. Откройте клип-пульт в режиме редактирования, выделите кнопку питания и добавьте обработчик события

on (release) {

power();

}

Здесь вызывается функция power, которую мы сделаем глобальной и разместим в кадре 1 главной временной шкалы.

  1. Добавьте в конец кода кадра 1 глобальную функцию power

_global.power = function () {

tv.power = ! tv.power;

if ( tv.power ) {

tv.lamp.gotoAndStop("on");

channel ( tv.channel );

} else {

tv.lamp.gotoAndStop("off");

obj = eval("_level" + tv.channel);

obj._visible = false;

}

}

Во-первых, эта функция меняет значение переменной tv.power (это переменная power клипа tv) на обратное. Если питание включается, включается и лампочка, имеющая имя lamp внутри клипа tv, она переходит на кадр с меткой on. Функция channel (пока еще не написанная) включает канал, номер которого хранится в переменной channel того же клипа tv.

При выключении питания лампочка гаснет (переходит на метку off). Затем выключается (делается невидимым) ролик включенного канала. Для получения ссылки на нужный клип используется функция eval. Если значение tv.channel равно 1, то строчка

obj = eval("_level" + tv.channel);

запишет в переменную obj адрес _level1.

Теперь определим функцию для включения нужного канала.

  1. Добавьте в код кадра 1 еще одну глобальную функцию

_global.channel = function ( no ) {

if ( ! tv.power ) return;

if ( no < 1 ) no = MAX;

if ( no > MAX ) no = 1;

for ( var i=1; i<=MAX; i++ ) {

obj = eval("_level" + i);

if ( i == no ) {

obj._visible = true;

obj._x = tv.screenX;

obj._y = tv.screenY;

} else obj._visible = false;

}

tv.channel = no;

}

Сначала идет проверка исходных данных. Если питание не включено, ничего не происходит, потому что оператор return заканчивает выполнение функции.

Если задан номер канала меньше 1, включается последний канал с номером MAX. Если номер канала больше MAX, включается первый канал.

Далее в цикле перебираем все загруженные клипы. Для нужного клипа включаем видимость и устанавливаем координаты, равные абсолютным координатам экрана телевизора. Все остальные клипы выключаем (_visible=false).

В конце функции номер включенного канала записывается в переменную channel клипа tv.

Остается добавить обработчики для кнопок пульта.

  1. Войдите в режим редактирования клипа-пульта и добавьте обработчик кнопки с цифрой 1:

on ( release ) {

channel ( 1 );

}

  1. и обработчик кнопки перехода на следующий канал:

on (release) {

channel( _root.tv.channel + 1 );

}

Аналогично составьте обработчики остальных кнопок. Сохраните файл c именем ЛР7_1.fla и проверьте работу фильма.

Обратите внимание, что в обработчиках кнопок-стрелок не проверяется допустимость нового номера канала — этим занимается функция channel.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]