Опубликован: 04.11.2006 | Уровень: специалист | Доступ: платный
Урок 5:

Применение функций

< Урок 4 || Урок 5: 123 || Урок 6 >

Создание функции с аргументами

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

function convertToMoonWeight (myWeight) {
  weightOnMoon = myWeight/6.04;
}

Эта функция вычисляет, какой вес будет иметь какой-либо предмет на Луне; единственный параметр этой функции – myWeight (вес предмета на Земле), и он указывается при объявлении функции, как если бы это была существующая переменная.

А вот пример вызова этой функции:

convertToMoonWeight(165);

Как видите, при вызове функции ей передается (то есть указывается в скобках) некоторое значение. В данном случае это вес некоторого предмета на Земле, равный 165. Это значение на время выполнения функции присваивается параметру myWeight. Так, в результате передачи нашей функции convertToMoonWeight () значения 165, переменная внутри функции weightOnMoon получит значение 165/6.04, или 27.32.

Совет При вызове функции создается временный массив под названием arguments. Этот массив содержит все передаваемые параметры – даже если при объявлении функции вы не указали ни одного. Вот как, например, можно получить доступ к массиву arguments:

function traceNames() {
  trace("Этой функции передано " + arguments.length + " аргументов");
  trace("Значение первого аргумента: " + arguments[0]);
  trace("Значение второго аргумента: " + arguments[1]);
}
traceNames("Kelly","Hayes");

В результате выполнения этого кода в окне вывода будет отображено следующее:

Этой функции передано 2 аргументов;

Значение первого аргумента: Kelly;

Значение второго аргумента: Hayes;

Возможность доступа к массиву arguments позволяет создавать функции, функциональность которых может меняться в зависимости от того, сколько параметров им передано. Подробнее о массивах вы узнаете в Уроке 7 – Работа с динамическими данными.

В этом упражнении мы запрограммируем цифровые кнопки на пульте управления, а также кнопки последовательного перебора каналов – Up и Down. Цифровые кнопки будут вызывать некую функцию, передавая ей номер канала, на который следует переключиться. Также мы слегка модифицируем функцию togglePower().

  1. Откройте файл television2.fla из папки Lesson05/Completed.

Этот файл практически ничем не отличается от того, с которым мы работали до этого, за исключением того, что фильм-символ screen содержит теперь шесть кадров каналов вместо одного.

  1. Выделите кадр 1 слоя Actions на основном монтажном столе и откройте панель Действия (Actions). После уже имеющегося объявления функции добавьте такой скрипт:
function changeTheChannel (newChannel) {
  if (tvPower) {
    currentChannel = newChannel;
    tv.screen.gotoAndStop(newChannel + 1);
    remote.light.play();
  }
}

Вы только что создали функцию с параметром. Она меняет канал телевизора, основываясь на полученном значении параметра ( newChannel ). Все действия, выполняемые функцией, заключены в теле оператора if, в результате чего смена канала может происходить только в том случае, если tvPower имеет значение true. Функция присваивает переменной, хранящей номер текущего канала, значение переданного параметра. Две следующие строки вам уже знакомы – они использовались в функции togglePower(), которую мы создали в предыдущем упражнении: установка кадра экземпляра фильма-символа screen (в результате чего меняется картинка на экране телевизора) и указание воспроизвести экземпляр фильма-символа light (мигает огонек на пульте управления). Давайте рассмотрим пример. Допустим, имеет место такой вызов функции:

changeTheChannel(4);

Прежде, чем что-либо сделать, функция проверит значение переменной tvPower. Если оно равно true (телевизор включен), то currentChannel получает значение 4 (что было передано функции в качестве параметра). Далее экземпляр фильма-символа screen перемещается к кадру, номер которого определяется как значение параметра плюс один (то есть 4 + 1). Таким образом, screen переходит к кадру 5.

Теперь мы можем использовать созданную функцию – ее будут вызывать цифровые кнопки на нашем пульте управления.

  1. Двойным щелчком на экземпляре фильма-символа remote откройте его для редактирования на месте. Откройте панель Действия, выделите на пульте круглую кнопку с цифрой 1 и введите такой скрипт:
on (release) {
  _root.changeTheChannel(1);
}

Повторите то же самое для всех кнопок с цифрами – от 2 до 6. В каждом случае в качестве параметра указывайте номер канала, который должна включать кнопка.

Функция changeTheChannel() находится на основном монтажном столе, так что при вызове следует использовать адресацию: _root.

  1. Выполните команду Управление > Проверить фильм (Control > Test Movie). Нажмите на пульте кнопку Power, чтобы включить телевизор, затем с помощью цифровых кнопок меняйте каналы.

Нажатие на цифровые кнопки до включения телевизора ни к чему не приводит – функция changeTheChannel() не выполняет никаких действий. Если же телевизор включен, то при нажатии на цифровую кнопку экземпляр фильма-символа screen перемещается к кадру (каналу), номер которого был передан функции changeTheChannel() в качестве параметра.

  1. Закройте тестовый фильм и вернитесь в среду разработки. При открытой панели Действия выделите кадр 1 слоя Actions.

Этот кадр содержит объявление двух функций; одна из них включает и выключает телевизор, а другая меняет каналы. Но обратите внимание – программный код этих функций содержит одинаковые строки: обе функции содержат указание мигнуть лампочкой на пульте управления и переместить экземпляр фильма-символа screen к определенному кадру. Такая избыточность кода совсем ни к чему, так давайте это исправим.


  1. Измените функцию togglePower(), чтобы она выглядела так:
function togglePower() {
  if (tvPower) {
    changeTheChannel(0);
    tvPower = false;
  } else {
    tvPower = true;
    changeTheChannel(1);
  }
}

Теперь функция togglePower() для смены канала при включении и выключении телевизора вызывает функцию changeTheChannel(). При включении TV функция changeTheChannel() вызывается со значением параметра 1. То есть каждый раз при включении устанавливается первый канал. При выключении устанавливается канал 0 (пустой экран телевизора). Итак, мы продемонстрировали, что одна функция может вызывать другую.

Примечание Обратите внимание, что в приведенном выше скрипте, в первой секции оператора if, вызов функции changeTheChannel() происходит до того, как переменной tvPower присваивается значение false. Дело в том, что функция changeTheChannel() запрограммирована нами так, что она работает только в том случае, если tvPower имеет значение true (а только в этом случае и выполняется эта секция оператора if ). Если бы мы поменяли строки и сначала присвоили tvPower значение false, вызов функции changeTheChannel(0) ни к чему не привел бы. А вот в секции else все как раз наоборот: сначала tvPower получает значение true, а потом вызывается функция. Причина та же – без этого вызов функции не будет иметь эффекта.

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

  1. Выделите первый кадр слоя Actions на основном монтажном столе. В панели Действия сразу после строки tvPower = false; вставьте такую строку:
numberOfChannels = 6;

Эта строка кода создает переменную numberOfChannels и присваивает ей значение 6. Эта переменная будет использоваться функцией (которую мы вскоре создадим), которая при каждом вызове будет увеличивать на единицу номер текущего канала. Как вы помните, экземпляр фильма-символа screen содержит только шесть картинок, представляющих каналы; поэтому и переменная имеет значение 6 – это общее число каналов, которые может демонстрировать наш телевизор, и переменная нужна для того, чтобы не случилось перехода к каналу, номер которого больше 6. Давайте посмотрим, как это будет работать.

  1. В конец имеющегося скрипта для текущего кадра добавьте следующий:
function channelUp () {
  if (currentChannel + 1 <= numberOfChannels) {
    changeTheChannel(currentChannel + 1);
  }
}

Эта функция (она не имеет параметров) каждый раз, когда ее вызывают, переключает канал на следующий. Однако здесь имеется "механизм защиты", чтобы не выйти за пределы имеющихся шести каналов. Помните – переменная с именем currentChannel получает новое значение каждый раз при вызове функции changeTheChannel() (см. шаг 2). Значение этой переменной – номер текущего канала минус 1. Например, если в данный момент включен канал 4, то эта переменная имеет значение 3. Так вот, при вызове функции channelUp, прежде чем выполнить какие-либо действия, оператор if проверяет, возможно ли переключиться на следующий канал: значение currentChannel + 1 должно быть меньше или равно максимальному номеру канала (значение numberOfChannels, или 6). Если это условие выполняется, вызывается функция changeTheChannel(), причем в качестве параметра указывается номер текущего канала плюс 1. В результате на экране будет отображен следующий канал. Здесь оператор if не имеет дополнительной секции else. Таким образом, если условие не выполняется, это значит, что в данный момент демонстрируется канал 6, поэтому никакие действия не выполняются.

  1. В конец имеющегося скрипта для текущего кадра добавьте следующий:
function channelDown () {
  if (currentChannel - 1 >= 1) {
    changeTheChannel(currentChannel - 1);
  }
}

Эта функция, подобно channelUp(), не имеет параметров. Чтобы номер канала не оказался меньше 1, первым делом при вызове функции проверяется условие: значение переменной currentChannel, уменьшенное на 1, не должно быть меньше единицы. Если условие выполнено, вызывается функция changeTheChannel(), и в качестве параметра ей передается значение currentChannel минус 1. На экране отображается предыдущий канал. Как и в предыдущей функции, оператор if не имеет дополнительной секции else. Поэтому, если условие не выполняется – значит, что в данный момент демонстрируется канал 1, и никакие действия не выполняются.

Теперь нужно применить только что созданные нами функции channelUp() и channelDown() – их должны вызывать кнопки Up и Down на нашем пульте управления.

  1. Двойным щелчком на экземпляре фильма-символа remote откройте его для редактирования на месте. Выделите на пульте кнопку-стрелку Up и введите в панели Действия такой скрипт:
on (release) {
  _root.channelUp();
}

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

  1. Выделите на пульте кнопку-стрелку Down и введите в панели Действия такой скрипт:
on (release) {
  _root.channelDown();
}

Эта кнопка, как и предыдущая, вызывает функцию, расположенную на корневом монтажном столе. Каждый раз при нажатии вызывается функция channelDown() и переменная currentChannel уменьшается на единицу (пока не достигнет нижнего предела). Телевизор переключается на соответствующий канал.

  1. Выполните команду Управление > Проверить фильм (Control > Test Movie). Включите телевизор, нажав кнопку Power, и попробуйте менять каналы с помощью кнопок Up и Down.

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

  1. Закройте тестовый фильм и сохраните свою работу под именем television3.fla.

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

< Урок 4 || Урок 5: 123 || Урок 6 >
Салтанат Бектегенова
Салтанат Бектегенова

Дострочное пересдача экзамена

 

Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт:

Евгения Дегтяренко
Евгения Дегтяренко
Украина, Запорожье
Анна Елисеева
Анна Елисеева
Россия, Великий Новгород, Ногородский государственный университет имени Ярослава Мудрого, 2003