[ предыдущая страница ] [ следующая страница ] [ содержание ]

5.6.7. Управление звуковым сопровождением

Для управления звуком в языке ActionScript предусмотрен объект Sound (Звук). Чтобы применить этот объект, нужно сначала создать его с помощью оператора new.

а = new Sound();

Здесь вместо a можно использовать любое имя новой переменной. Если при создании объекта Sound в скобках ничего не указано, то объект создается в основном ролике. Если необходимо создать объект Sound внутри экземпляра мувика, в скобках надо указать его имя, например, так:

а = new Sound(MyMovieClip);

После того как объект Sound создан, с помощью его методов можно управлять воспроизведением звука в основном ролике или внутри мувиков. Метод stop останавливает воспроизведение звука. Например, чтобы нажатие на клавишу (к примеру, ESC) останавливало звучание, достаточно написать следующую строку

if (key.isDown(key.ESCAPE)) a.stop ();

и обеспечить цикличность исполнения этого кода. Например, установите периодическое возвращение в кадр с этим кодом или поместите его в мувик внутрь оператора onClipEvent.

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

Метод start, наоборот, позволяет программно начать воспроизведение звука. Если ролик или мувик содержит несколько звуков, метод start запускает последний из них. Можно заставить звукозапись воспроизводиться не сначала, указав смещение в секундах. Кроме того, можно указать количество повторов звука. Например, если написать

a.start (2,6);

то звук начнется не сначала, а с двухсекундной отметки, и повторится шесть раз.

С помощью метода setVolume можно программно изменять громкость звука. При этом значение 100 означает максимально возможную громкость (собственно говоря, оригинальную громкость импортированного звука - если звук изначально тихий, то усилить его этим методом нельзя). Значение 0 означает минимальную громкость - звук фактически отсутствует. Например, строка

a.setVolume (50);

сделает звук вдвое тише, чем громкость оригинала.

С помощью метода setPan можно устанавливать пространственную позицию (выполнять панорамирование) звука. В этом случае значение -100 означает звук только в левом канале, а значение 100 - только в правом. Следующая строка установит звук по центру:

a.setPan (0);

Пример управления звуком

Давайте приведем небольшой пример. Пусть требуется создать ролик, который постоянно воспроизводит звук, а пользователь может с помощью клавиш ВЛЕВО и ВПРАВО перемещать его по стереопанораме.

Откроем новый ролик, импортируем в него звук, который хорошо зацикливается (главное условие этого - одинаковый уровень сигнала в начале и в конце, что обеспечивает гладкую стыковку). Перетащим его из библиотеки в рабочую область. Передвинем звук во второй кадр, оставив первый пустым. На вспомогательной панели Sound (Звук) выберем в раскрывающемся списке Sync (Синхронизация) пункт Start (Новый запуск). Это необходимо, чтобы звук не накладывался сам на себя.

Создадим новый слой для сценария. В первом кадре создадим объект Sound и зададим начальное значение переменной i, управляющей перемещением звука по стереопанораме:

a = new Sound();
i = 0;

Перейдем во второй кадр. В нем мы методом key.isDown проверим, не нажата ли одна из интересующих нас клавиш. Если это так, мы, соответственно, увеличим или уменьшим значение переменной i, а затем переместим звук по стереопанораме на новое место методом setPan. Если ни одна из интересующих нас клавиш не нажата, значение переменной i не изменится и, соответственно, метод setPan сработает "вхолостую" - звук останется "на прежнем месте".

Правда, неплохо бы еще и ограничить диапазон значений переменной i. Поэтому к проверке на нажатие клавиши мы добавим еще проверку на достижение минимального и максимального значения переменной i. Ведь если значение i уже достигло 100, дальше увеличивать его нет смысла, а если оно достигло -100, то нет смысла его уменьшать.

Вот какой код получится во втором кадре:

if ((key.isDown(key.RIGHT))&&(i<100)) i += 5;
if ((key.isDown(key.LEFT))&&(i>-100)) i -= 5;
a.setPan (i);

Здесь мы увеличиваем и уменьшаем значение переменной i сразу на 5, чтобы перемещение звука было достаточно ощутимым. Вместо 5 можно установить любую подходящую величину.

И, наконец, в третьем кадре напишем единственную строку

gotoAndPlay (2);

чтобы обеспечить циклическое повторение кода второго кадра.

Ролик готов. Просмотрите (или, вернее будет сказать, прослушайте) его. При управлении с клавиатуры звук перемешается по стереопанораме вправо и влево.

Управление стереосигналом

Кроме вышеперечисленных методов, объект Sound содержит еще и метод setTransform. Этот метод позволяет "перепанорамировать" стереозвуки, по-новому выставив баланс между левым и правым каналом, а также свободно микшируя каналы.

Грубо говоря, любой стереозвук поступает на вход программы Flash в виде двух сигналов, идущих по левому и правому каналам. Будем называть их входными каналами.

На выходе у программы Flash также имеются левый и правый каналы (назовем их выходными). Если звук не трансформировать, то сигнал с левого входного канала направляется на левый выходной, а сигнал с правого входного - на правый выходной канал.

Однако, включив звуковую трансформацию, можно произвольно направлять звук на выходные каналы. Например, можно сделать так. Звук с левого входного канала с 80-процентной громкостью направляется на левый выходной канал и с 20-процентной громкостью - на правый. Звук с правого входного канала, соответственно, с 80-процентной громкостью направляется на правый выходной канал и с 20-процентной громкостью - на левый. Этот процесс иногда называют стереосглаживанием.

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

Метод setTransform позволяет применить звуковую трансформацию, подобную описанной. Применяя этот метод, следует в качестве аргумента указать имя объекта, имеющего свойства ll, lr, rl, rr. Эти свойства означают:

Для создания объекта, имеющего вышеописанные свойства, следует использовать объект "общего назначения" Object. Например, чтобы совершить первую из описанных звуковых трансформаций (стереосглаживание), следует написать такой код:

a = new Sound();
b = new Object();
b = {ll:80,lr:20,rl:20,rr:80}
a.setTransform (b);

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

5.6.8. Работа с полями ввода

При работе с полями ввода можно программно взаимодействовать с пользователем, пользуясь объектом Selection (Выбор). Делается это следующим образом.

С помощью метода getFocus можно получить имя переменной, соответствующей активному полю ввода (то есть тому, которое имеет в данный момент фокус ввода), например:

a = Selection.getFocus();

Соответственно, таким же образом с помощью метода setFocus можно установить фокус ввода на любое поле ввода. Например, если нужно перевести фокус ввода на поле, которому соответствует переменная myfield, достаточно написать:

Selection.setFocus (myfield);

С помощью методов getBeginlndex, getEndlndex и getCaretlndex можно получить значения позиций начала выделения, конца выделения, а также текущей позиции курсора в активном поле ввода. Например, если в поле ввода находится текст "Здравствуйте, я ваша тетя!" и пользователь выделили слово "ваша", то метод getBeginlndex вернет значение 16 (нумерация символов начинается с 0), а метод getEndbdex - значение 20 (номер первого невыделенного символа после выделения).

Можно также программно выделить фрагмент текста в поле пользовательского ввода. Для этого следует использовать метод setSelection, которому следует указать номера символов начала и конца выделения. Например, для того, чтобы выделить в поле с надписью "Здравствуйте, я ваша тетя!" слово "Здравствуйте", следует написать:

Selection.setSelection (0,12);

Если применить методы getBeginlndex, getEndlndex и getCaretlndex при отсутствии фокуса ввода в каком-либо поле ввода, они вернут значение -1. Метод getFocus при этом вернет значение null.

5.6.9. Дополнительные объекты ActionScript

В некоторых случаях вместо числовой переменной может потребоваться использование специального объекта Number (Число). Используя его свойства, можно получить минимально и максимально возможные значения, а также значения +∞ (плюс бесконечность), -∞ (минус бесконечность) и специальное значение NaN (Not a Number - не число). Свойства объекта Number приведены в приложении 2.

В языке ActionScript существует также объект Boolean (Логическое значение), принимающий логические значения "истина" (true) или "ложь" (false). В некоторых случаях для логической ясности может потребоваться применение этого объекта.

Кроме того, существует еще один тип объекта - MovieClip (Мувик). Объекты этого типа не нуждаются в создании с помощью оператора new. Они ассоциированы с мувиками, хранящимися в библиотеке ролика. Поэтому методы этого объекта можно использовать, просто обращаясь к объекту по имени.

Например, если существует мувик по имени abc, можно написать что-нибудь вроде

abc.gotoAndPlay (10);

Эта запись аналогична традиционной

tellTarget ("abc") {
   gotoAndPlay (10);
}

В приложении 2 можно найти полный список методов объекта MovieClip. Если внимательно посмотреть на этот список, можно заметить, что многие методы этого объекта совпадают по имени и назначению с операторами, относящимися к основному ролику и мувикам. Поэтому здесь мы не станем подробно останавливаться на применении этих методов, однако в следующих главах будем время от времени их использовать.

Вообще говоря, одноименность методов объекта MovieClip и соответствующих операторов призвана "облегчить жизнь" флэшеру. Осуществляя какое-либо действие с мувиком, можно не задумываться о том, применяем ли мы метод объекта или оператор. В конце концов, это различие относится только к "внутренней жизни" языка ActionScript...

5.7. Функции AS

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

Две самые простые функции - это true и false, возвращающие, соответственно, логические значения "истина" и "ложь". Вообще говоря, мы уже применяли их, даже не задумываясь о том, что это функции. Далее следуют функции String, Number и Boolean, которые преобразуют свой аргумент в соответствующий тип. Например, чтобы явно преобразовать число в строку, достаточно написать примерно следующее:

q = String(q);

При этом если до выполнения функции переменная q имела, например, числовое значение 34, то после выполнения этой функции она получит строковое значение "34".

Функция escape, принимая строку в качестве аргумента, преобразует все ее символы, не разрешенные в протоколе HTTP, в их шестнадцатеричные эквиваленты. Каждый такой символ преобразуется в три: знак процента (%) и следующий за ним двузначный шестнадцатеричный код.

Так, если написать

b = escape("Здравствуйте!");

то в листинге переменных получим

Variable _level0.b = "%C7%E4%F0%E0%E2%F1%F2%E2%F3%E9%F2%E5%21"

Существует также функция unescape, которая выполняет противоположные действия, преобразуя строку вышеописанного формата (обычно это адрес URL) в обычный текст.

Функция getTimer возвращает количество миллисекунд, прошедшее с момента начала проигрывания ролика. В предыдущих версиях системы Flash использование этой функции было единственной возможностью контроля времени. Теперь значимость этой функции снизилась за счет возможности использования объекта Date, однако во многих случаях проше применить функцию getTimer.

Вот как можно, например, остановить в каком либо кадре анимацию на 5 секунд. Нужно создать новый слой (если еще нет слоя для сценариев), создать в этом слое ключевой кадр в нужно позиции и ввести туда такой код:

a = getTimer();
stop ();
while (getTimer()-a<5000);
play ();

Здесь в первой строке мы запоминаем время, прошедшее с момента старта ролика до этого кадра, в переменной a. Затем мы останавливаем анимацию оператором stop и начинаем в пустом цикле сравнивать разность текущего и сохраненного времени со значением 5000 миллисекунд, или 5 секунд. Через пять секунд эта разность станет равна 5000, и произойдет выход из цикла. Цикл завершается, и следующий оператор play вновь запустит анимацию.

С помощью функции getVersion можно узнать текущую версию проигрывателя Flash. Это может потребоваться, если ролик должен быть совместим со старыми версиями.

5.7.1. Работа с именами переменных

Функция eval трактует свой аргумент как имя переменной и возвращает значение этой переменной. Например, если мы напишем

а = 45;
name = "a";
b = eval(name);

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

pnt = "vrb";

Тогда код

set (pnt,280);

присвоит переменной vrb значение 280. Прочитать его также можно через переменную pnt (указатель):

а = eval(pnt);

Здесь переменной а присваивается значение 280.

Другим полезным свойством функции eval является возможность работать с переменными с вычисляемым именем. Например, если у нас есть переменные с именами a1, a2, а3 и так далее, их имена вполне можно "вычислять", составляя их из символа "a" и числового значения, например:

a1 = 124;
i = 1;
b = eval("a"+i);

Если мы напишем такой код и просмотрим листинг переменных, то увидим, что переменной b присвоено значение 124.

5.7.2. Числа, записанные как строки

Весьма полезны при математических вычислениях функции parseFloat и parseInt. Первая из них выделяет из строки число с плавающей точкой. Например, если написать

q = parseFloat("3.57dfkglj dfgj 45 67");

то переменной q будет присвоено числовое значение 3,57. Как видите, эта функция ищет первый нецифровой символ, останавливая на этом выделение числа. Если строка начинается с буквы, функция parseFloat возвращает значение 0.

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

q = parseInt("3.57dfkglj dfgj 45 67");

то она возвратит число 3. Эту функцию также можно применять и для выделения целой части из числа с плавающей точкой (для этих целей в предыдущих версиях Flash использовалась функция int).

Однако функция parseInt имеет еще одну особенность - она может "понимать" числа, записанные в других системах счисления. При этом в качестве второго аргумента необходимо указать основание системы счисления. Например, если написать

q = parselnt(1011,2);
w = parselnt("FF",16);

то вот что мы увидим в листинге переменных:

Variable _level0.q = 11
Variable _level0.w = 255

Только надо иметь в виду, что при использовании в записи чисел буквенных символов (что случается при использовании систем счисления с основанием, большим 10), такие "числа" следует заключать в кавычки (что бы функция считала их строками). Если используются только цифровые символы, кавычки необязательны. Максимальное основание системы счисления, которое "понимает" функция parseInt - 32.

Иногда до сих пор можно встретить устаревшую функцию random, которая возвращает псевдослучайное число. Однако для этого рекомендуется пользоваться методом Math.random.

Функции isFinite и isNaN позволяют проверить, является ли их аргументы соответственно конечным числом и не числом. Они возвращают логические значения true или false. Функции newline, scroll и maxscroll используются для управления динамическими текстовыми полями. Эта тема будет рассмотрена в главе 6.

И, наконец, крайне важны функция getProperty и оператор setProperty, которые используются для управления свойствами экземпляров флэш-символов. Их мы также рассмотрим в следующей главе, в разделе, посвященном свойствам экземпляров, поскольку это уже отдельная тема.

[ предыдущая страница ] [ следующая страница ] [ содержание ]
Hosted by uCoz