В этом уроке вы узнаете, как создавать и использовать функции на примере программирования "пульта дистанционного управления" для Flash-
В этом уроке:

Для несложного Flash-приложения, представляющего
телевизор с пультом управления, мы создадим несколько функций, позволяющих включать-выключать Flash-ТВ и переключать каналы.
На выполнение этого урока требуется примерно полтора часа.
Файлы-носители:
Нет
Стартовые файлы:
Lesson05/Completed/television1.fla Lesson05/Completed/television2.fla Lesson05/Completed/television3.fla
Законченные проекты:
television4.fla
Прежде чем использовать функцию, ее следует создать, или объявить. Для этого существует два варианта синтаксиса.
В первом варианте программный код выглядит так:
function myFunction (аргумент1, аргумент2, и т.д.) {
// выполняемые действия;
}
Приведенный код представляет наиболее общий способ создания функций, именно такой синтаксис будет по большей части использоваться в этом уроке. Как видите, function, за которым следует
Следом за круглыми скобками идет открывающая фигурная скобка, затем – какие-либо действия, и закрывающая фигурная скобка, которая завершает

Совет Скелет функции (то есть функцию, в которую вам предстоит добавить действия) вы можете создать при помощи
В первом варианте код таков:
myFunction = function (аргумент1, аргумент2, и т.д.) {/*действия*/};
Этот вариант можно использовать для динамического создания функции или создания своего = ", назначается функция. Этот синтаксис вы сможете использовать только при ручном вводе в окно панели Действия, когда эта панель находится в Экспертном режиме ( ).
Вызов функции без параметров имеет следующий синтаксис:
myFunction();
Когда вы вызываете функцию, Flash выполняет все действия, содержащиеся внутри этой функции. Если, к примеру, myFunction() содержит 20 действий, считайте, что все они уместились в одной этой строке скрипта.
Если функция объявлена с аргументами, вы должны использовать при ее вызове следующий синтаксис:
myFunction(значение аргумента1, значение аргумента2);
В этом примере предполагается, что
_root.clip1.clip2.myFunction();
В этом упражнении мы создадим кнопку
Совет Вызов функции можно организовать динамически, используя значение переменной. Например, так: _root.[aVariableName]() ;. Если aVariableName имеет значение " sayHello ", то получится вызов функции _root.sayHello();.
Общая структура фильма уже создана. В слое Actions мы будем размещать большую часть наших скриптов. В слое , на его монтажном столе – три слоя: нижний слой (называется , который, в свою очередь, содержит два слоя и два кадра, графическое содержание которых представляет разные "программы", которые можно будет смотреть, переключая каналы
На основном монтажном столе имеется еще один слой – . В нем вы найдете слой, содержащий большую часть изображений, составляющих пульт управления, в том числе экземпляр фильма-символа light, а также слой, содержащий кнопки пульта – все они в итоге будут содержать скрипты.
tvPower = false;
function togglePower () {
if (tvPower) {
newChannel = 0;
tvPower = false;
} else {
tvPower = true;
newChannel = 1;
}
tv.screen.gotoAndStop(newChannel + 1);
remote.light.play();
}
В первой строке скрипта создается переменная tvPower, она будет использоваться для отслеживания текущего состояния true означает, что он включен, false – выключен. Изначально tvPower присваивается false. Следующие семь строк представляют собой togglePower() – эта функция при вызове будет включать или выключать tvPower получает значение false и функция togglePower() объявляется после загрузки этого кадра (то есть сразу после старта фильма).

Совет Поскольку функции должны быть объявлены до их вызова, обычно все объявления функций помещают в кадр1, чтобы затем их можно было вызвать в любой момент.
В первой части функции используется оператор if, который анализирует текущее значение tvPower. Если в момент вызова функции значение переменной tvPower равно true (ТВ включен), то ей присваивается значение false (выключено), а переменной newChannel – значение 0; в противном случае ( else ) tvPower получает значение true, а newChannel = 1. Так с помощью оператора if мы меняем значение tvPower на противоположное при каждом вызове функции, при этом изменяя еще значение переменной newChannel – после выполнения этого оператора она получает значение 0 либо 1.
Затем функция отсылает экземпляр фильма-символа (он находится внутри экземпляра ) к кадру с номером newChannel + 1. К значению newChannel непременно следует добавить единицу, ведь эта переменная у нас может принимать значение 0, а во Flash кадра 0 быть не может! В итоге эта строка функции отсылает экземпляр фильма-символа к кадру 1 (изображающему пустой экран
Завершается функция указанием проиграть фильм-символ light на пульте управления – огонек мигнет, показывая, что кнопка была нажата.
Теперь у нас на главном монтажном столе, в кадре 1, имеется функция. Однако, хотя она содержит несколько действий, ни одно из них не будет выполнено, пока функция не будет вызвана.
on (release) {
_root.togglePower();
}

Этот скрипт вызывает функцию togglePower(), созданную нами на предыдущем шаге. Необходимо отметить, что, поскольку эта функция находится на основном монтажном столе, при вызове мы должны указать путь к ней – _root.
Каждый раз при нажатии кнопки togglePower() и выполняются все действия, входящие в нее. Как и ожидалось, эти действия включают либо выключают
Мы только что создали функцию и применили ее! В следующем разделе мы разовьем идею и создадим более мощную и многоцелевую функцию.
В предыдущем упражнении вы узнали, как создать функцию и вызвать ее с любого монтажного стола. В этом упражнении мы создадим функцию с параметрами. Вот пример
function convertToMoonWeight (myWeight) {
weightOnMoon = myWeight/6.04;
}
Эта функция вычисляет, какой вес будет иметь какой-либо предмет на Луне; единственный параметр этой функции – myWeight (вес предмета на Земле), и он указывается при объявлении функции, как если бы это была существующая переменная.
А вот пример вызова этой функции:
convertToMoonWeight(165);
Как видите, при вызове функции ей передается (то есть указывается в скобках) некоторое значение. В данном случае это вес некоторого предмета на Земле, равный 165. Это значение на время выполнения функции присваивается параметру myWeight. Так, в результате передачи нашей функции convertToMoonWeight () значения 165, переменная внутри функции weightOnMoon получит значение 165/6.04, или 27.32.
Совет При вызове функции создается временный массив под названием . Этот массив содержит все передаваемые параметры – даже если при объявлении функции вы не указали ни одного. Вот как, например, можно получить доступ к массиву :
function traceNames() {
trace("Этой функции передано " + arguments.length + " аргументов");
trace("Значение первого аргумента: " + arguments[0]);
trace("Значение второго аргумента: " + arguments[1]);
}
traceNames("Kelly","Hayes");
В результате выполнения этого кода в окне вывода будет отображено следующее:
Этой функции передано 2 аргументов;
Значение первого аргумента: Kelly;
Значение второго аргумента: Hayes;
Возможность доступа к массиву
В этом упражнении мы запрограммируем цифровые кнопки на пульте управления, а также кнопки Up и Down. Цифровые кнопки будут вызывать некую функцию, передавая ей номер канала, на который следует переключиться. Также мы слегка модифицируем функцию togglePower().
Этот файл практически ничем не отличается от того, с которым мы работали до этого, за исключением того, что фильм-символ содержит теперь шесть кадров каналов вместо одного.

function changeTheChannel (newChannel) {
if (tvPower) {
currentChannel = newChannel;
tv.screen.gotoAndStop(newChannel + 1);
remote.light.play();
}
}
Вы только что создали функцию с параметром. Она меняет канал newChannel ). Все действия, выполняемые функцией, заключены в if, в результате чего смена канала может происходить только в том случае, если tvPower имеет значение true. Функция присваивает переменной, хранящей номер текущего канала, значение переданного параметра. Две следующие строки вам уже знакомы – они использовались в функции togglePower(), которую мы создали в предыдущем упражнении: установка кадра экземпляра фильма-символа (в результате чего меняется картинка на экране light (мигает огонек на пульте управления). Давайте рассмотрим пример. Допустим, имеет место такой вызов функции:
changeTheChannel(4);
Прежде, чем что-либо сделать, функция проверит значение переменной tvPower. Если оно равно true (currentChannel получает значение 4 (что было передано функции в качестве параметра). Далее экземпляр фильма-символа перемещается к кадру, номер которого определяется как значение параметра плюс один (то есть 4 + 1). Таким образом,
Теперь мы можем использовать
on (release) {
_root.changeTheChannel(1);
}
Повторите то же самое для всех кнопок с цифрами – от 2 до 6. В каждом случае в качестве параметра указывайте номер канала, который должна включать кнопка.
Функция changeTheChannel() находится на основном монтажном столе, так что при вызове следует использовать адресацию: _root.
Нажатие на цифровые кнопки до включения changeTheChannel() не выполняет никаких действий. Если же перемещается к кадру (каналу), номер которого был передан функции changeTheChannel() в качестве параметра.
Этот кадр содержит объявление двух функций; одна из них включает и выключает

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

Эта строка кода создает переменную numberOfChannels и присваивает ей значение 6. Эта переменная будет использоваться функцией (которую мы вскоре создадим), которая при каждом вызове будет увеличивать на единицу номер текущего канала. Как вы помните, экземпляр фильма-символа содержит только шесть картинок, представляющих каналы; поэтому и переменная имеет значение 6 – это общее число каналов, которые может демонстрировать наш
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, поэтому никакие действия не выполняются.
function channelDown () {
if (currentChannel - 1 >= 1) {
changeTheChannel(currentChannel - 1);
}
}
Эта функция, подобно channelUp(), не имеет параметров. Чтобы номер канала не оказался меньше 1, первым делом при вызове функции проверяется условие: значение переменной currentChannel, уменьшенное на 1, не должно быть меньше единицы. Если условие выполнено, вызывается функция changeTheChannel(), и в качестве параметра ей передается значение currentChannel минус 1. На экране отображается предыдущий канал. Как и в предыдущей функции, оператор if не имеет дополнительной секции else. Поэтому, если условие не выполняется – значит, что в данный момент демонстрируется канал 1, и никакие действия не выполняются.
Теперь нужно применить только что созданные нами функции channelUp() и channelDown() – их должны вызывать кнопки Up и Down на нашем пульте управления.
on (release) {
_root.channelUp();
}

Каждый раз при нажатии этой кнопки будет вызываться функция channelUp() с корневого монтажного стола. Когда номер текущего канала достигнет верхнего предела (определяемого переменной numberOfChannels ), кнопка перестанет срабатывать, то есть переключать TB на следующий канал.
on (release) {
_root.channelDown();
}
Эта кнопка, как и предыдущая, вызывает функцию, расположенную на корневом монтажном столе. Каждый раз при нажатии вызывается функция channelDown() и переменная currentChannel уменьшается на единицу (пока не достигнет нижнего предела).
Обратите внимание – вы можете выбрать любой канал с помощью одной из цифровых кнопок, а потом уже переключать каналы последовательно кнопками Up и Down. Не правда ли, запрограммировать такое функционирование было несложно – с помощью переменной, хранящей номер текущего канала и созданных нами функций.
Мы создали полнофункциональный пульт управления для
Переменные, которые мы создавали и использовали до сих пор, были доступны любому скрипту Flash-фильма в любое время. Локальные же переменные создаются и используются только в
В принципе, в
Для создания локальной переменной имеется только один способ. Синтаксис таков:
var myName = "Jobe";
Обратите внимание на слово var: именно оно дает Flash понять, что эта переменная – локальная. Если такая строка присутствует внутри myName определена (и может быть использована) только внутри этой функции.

В одной строке можно объявить сразу несколько
var firstName = "Jobe", lastName = "Makar", email = "jobe@electrotank.com";
Теперь поговорим о функциях, которые возвращают конечный результат – то есть выдают некоторое значение. Представьте себе, например, калькулятор. Сам калькулятор – это функция, которая манипулирует числами и вызывает другие функции; вводимые вами числа – значения параметров, которые передаются вызываемой функции; а итог – это результат, возвращенный функцией после выполнения. Синтаксис строки для
return myVariable;
Функция выполняет действия, чтобы определить конечный результат. Этот результат затем возвращается в строку, содержащую вызов функции. Как только в return, выполнение функции немедленно прекращается – очень удобно, если нужно прервать выполнение функции. Вот пример
function convertToMoonWeight (myWeight) {
var newWeight = myWeight / 6.04;
return newWeight;
}
Вызов этой функции мог бы выглядеть так:
myWeightOnMoon = convertToMoonWeight(165);
В этой строке myWeightOnMoon используется вызов функции. Вызванная функция возвращает значение newWeight, значит, оно (27.32) и станет значением переменной myWeightOnMoon. Параметр myWeight автоматически создается как newWeight также удаляется, как только функция завершает свою работу.
В этом упражнении мы добавим к нашему телевизору "устройство приема кабельного ТВ", на
Совет При помощи действия return можно возвращать данные любого типа, будь то значение переменной, массив или любой другой объект.
Этот фильм очень похож на тот, с которым мы недавно работали, только под телевизором появилось новое устройство – приемник кабельного ТВ. Это фильм-символ, имя экземпляра – cableBox, содержит он несложную графику и текстовое поле с именем cableDisplay. В этом текстовом поле будет отображаться название выбранного канала.

channelNames = ["","News","Classics","Family","Cartoons","Horror","Westerns"];
Вы только что создали массив с именем channelNames. Массив содержит названия каналов, которые будут динамически вставляться в текстовую строку на кабельном приемнике. В массиве семь элементов channelNames[0] = "" (пустая строка), channelNames[1] = " и так далее. Эти система индексов будет важна для нас, поэтому постарайтесь понять ее.
Примечание Подробную информацию о массивах вы найдете в Уроке 7 – Работа с динамическими данными.
Теперь давайте создадим функцию, использующую текстовые элементы этого массива для отображения сообщений на кабельном приемнике.
function displayCableText () {
if (currentChannel != 0) {
var displayText = "Вы смотрите канал "+channelNames[currentChannel]+".";
} else {
var displayText = "";
}
return displayText;
}
Это описание функции displayCableText(), которая не имеет параметров. Ее предназначение – динамическое построение строки текста, который должен быть отображен в текстовом поле cableDisplay. Построенную строку функция возвращает действием return. Функция содержит displayText и строится текстовая строка с использованием элемента массива channelNames, индекс которого равен текущему значению currentChannel. Например, если в момент выполнения функции значение currentChannel равно 4, то получится вот что:
var displayText = "Вы смотрите канал "+channelNames[4]+".";
Поскольку в массиве channelNames элемент с индексом 4 – это "Cartoons", в итоге получаем:
var displayText = "Вы смотрите канал Cartoons.";
Если условие оператора if не выполнено, вступает в действие секция else: displayText создается с пустым значением (просто ""). Завершается функция возвратом значения displayText. Но куда же именно возвращается это значение? Это разъяснится на следующем шаге. А пока напомним, что, поскольку переменная displayText определена как локальная (с использованием var ), она будет выгружена из памяти сразу после того, как будет возвращено ее значение.
cableBox.cableDisplay.text = displayCableText();
Мы изменили функцию changeTheChannel(), чтобы каждый раз при смене канала (а это происходит при вызове этой функции) обновлялся текст в поле cableDisplay (в экземпляре фильма-символа cableBox ). Вставленная нами строка cableDisplay (это динамическое текстовое поле), используя значение, возвращаемое функцией displayCableText(). Итак, функция displayCableText() вызывается, выполняет свои действия и выдает значение. Это значение подставляется после знака равенства. Вот что означает "функция возвращает значение". Значение, выработанное функцией, возвращается в ту строку скрипта, которая вызвала эту функцию (как вы видели). А еще вы увидели отличный пример того, как функции экономят время при программировании. Мы расширили возможности функции changeTheChannel() – в одном-единственном месте, но все скрипты, вызывающие эту функцию, автоматически стали использовать и эти новые возможности!

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

Мы закончили работу с этим файлом. В ходе работы вы смогли применить все знания, полученные в этом уроке.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.