Знание принципов динамического управления звуком – ключ к созданию всего, от игр до собственных
Пользователь сможет перетаскивать мяч в пределах определенной области экрана; при этом будет соответствующим образом меняться громкость и баланс каналов (управляемые динамически). Кроме того, вы увидите, что
В этом уроке:
Sound Sound Sound attachSound()
Когда мы завершим этот проект, этот баскетбольный мяч будет звучать, как настоящий.
На выполнение этого урока требуется примерно полтора часа.
Файлы-носители:
Нет
Стартовые файлы:
Lesson16/Assets/basketball1.fla
Законченные проекты:
basketball6.fla
Большинство людей просто слушает музыку, не задумываясь при этом, как и откуда берутся эти звуки. Однако все звуки, от самых простых до самых сложных, представляют собой
Во
Для того, чтобы управлять звуком динамически, необходимо использовать объект типа . Важно запомнить, что каждый объект в момент его создания ассоциируется с конкретным монтажным столом фильма. Так, для динамического управления звуком на главном монтажном столе необходимо создать объект на главном монтажном столе. Чтобы управлять звуком в экземпляре клипа, следует создать объект на монтажном столе этого экземпляра. Точно также объекты управляют звуком и в фильмах, подгружаемых в уровни. Таким образом, , каждый из которых управляет звуком на своем монтажном столе.
Примечание Хотя монтажный стол может содержать несколько наложенных звуковых "слоев", важно понимать, что когда на этом монтажном столе создается (и тем самым ассоциируется с ним) объект , этот объект будет в равной мере управлять всеми звуками на этом монтажном столе. Это значит, что если для этого объекта
Синтаксис создания объекта несложен; выглядит это так:
soundObjectName = new Sound (Target);
Рассмотрим подробно. Здесь soundObjectName означает имя вашего нового объекта типа . Имя можно дать любое, лишь бы оно было запоминающимся для вас и соответствовало общим правилам и ограничениям для имен объектов и переменных (это значит, что в имени не должно быть пробелов, знаков препинания, имя не должно начинаться с цифры). Конструкция new означает в . Вместо Target в скобках нужно подставить адресную ссылку на монтажный стол, с которым будет связан данный объект .
Как только создан связанный с монтажным столом объект , для управления свойствами звука (например, громкостью и балансом каналов) на этом монтажном столе следует ссылаться в скриптах на имя этого объекта , а не на адрес или имя экземпляра монтажного стола.
Давайте рассмотрим пример. Мы создаем объект для управления звуком в экземпляре клипа под названием myMovieClip:
mySound = new Sound ("_root.myMovieClip");

Теперь, когда у нас есть объект , связанный с экземпляром клипа myMovieClip, мы можем воспользоваться методом setVolume(), чтобы динамически установить 50-процентный уровень громкости:
mySound.setVolume (50);
Как уже говорилось, цель учебного проекта этого урока – имитация звука баскетбольного мяча, прыгающего по площадке. В первом упражнении мы создадим объект типа – это будет первый шаг к цели нашего проекта.
Этот файл состоит из двух слоев: Background и basketball. В нем и будут заложены все интерактивные возможности нашего проекта.
Монтажный стол этого клипа состоит из трех слоев: Shadow,

На монтажном столе этого клипа нет действия stop(), и значит, он будет автоматически проигрываться раз за разом, изображая постоянно прыгающий мяч.
Давайте же создадим объект , связанный с экземпляром клипа basketball. Это позволит нам управлять громкостью и балансом каналов звука удара мяча по полу – в то время, как пользователь будет перетаскивать мяч по нашей "площадке".
onClipEvent (load) {
bounce = new Sound (this);
}
Поскольку этот скрипт присоединен к экземпляру клипа basketball, и значит, он будет выполнен, как только этот экземпляр загрузится (то есть впервые появится в сцене). Скрипт всего лишь содержит функцию, создающую новый объект , имеющий имя и связанный с этим ( this, то есть basketball ) монтажным столом. Звукозапись удара мяча находится на этом монтажном столе, и значит, управляя объектом , мы сможем динамически менять громкость и баланс каналов этой звукозаписи.
Совет Создание объекта с помощью обработчика события onClipEvent(load) – наиболее эффективный способ. Таким образом мы создаем объект только после того, как управляемый им экземпляр загружен в сцену; это упрощает дальнейшую работу со скриптами и делает их понятнее.
В нынешнем виде наш проект не выглядит особо динамичным. Перемещать мяч нельзя, и он уныло скачет на одном месте, издавая один и тот же звук. Ну, по ходу урока мы эту ситуацию исправим. Сейчас важно уяснить, что как только экземпляр-мяч появляется в сцене (а это происходит практически моментально после запуска), создается объект . Ну, а звук не может измениться, пока мы не велим нашему новому объекту сделать что-либо.
Можете оставить файл открытым, поскольку с ним мы будем работать на протяжении всего урока.
Чтобы наш проект стал действительно интерактивным, просто необходимо обеспечить возможность перетаскивания экземпляра клипа, изображающего мяч. Ведь именно положение мяча на экране должно определять громкость и баланс звука "отскока". Однако мы не можем позволить пользователю таскать мяч по всему экрану, ведь никаких отскоков мяча от стен у нас не предусмотрено, а надо, чтобы все выглядело реалистично. Поэтому мы должны ограничить область перетаскивания в пределах площадки.

Запрограммировать возможность перетаскивания объекта только в пределах определенной области можно несколькими способами. В этом упражнении мы покажем, как реализовать это при помощи отслеживания положения мыши – возможность перетаскивания будет сохраняться только до тех пор, пока мышь не выходит за установленные пределы.
Если вы не закрыли файл после выполнения предыдущего упражнения, продолжайте работать с ним.
Прежде, чем мы приступим, важно обдумать проблему "руки" – как перетаскивать экземпляр-мяч синхронно с перемещением мыши и при этом ограничить перетаскивание некими границами.
Первым делом нам следует обозначить область перетаскивания. Во
Верхняя граница = 200 Нижняя граница = 360 Левая граница = 60 Правая граница = 490

Посмотрите на стрелки на иллюстрации – все расстояния отмеряются либо от верхней стороны сцены, либо от левой.
Совет Самый простой способ определения нужных граничных координат – визуальный. Нужно просто нарисовать на сцене прямоугольник, который можно затем перемещать, растягивать или сжимать до нужных размеров. Выделите нарисованный прямоугольник и откройте панель Информация ( Info ). С помощью значений X, Y, W и H можно определить значения граничных координат. Y – это координата X – координата левой границы, сумма Y+H даст координату X+W – координату правой границы. После того, как граничные координаты определены, прямоугольник можно удалить. Есть и другие способы определения границ, но они не столь очевидны, как этот.
Итак, мы хотим, чтобы наш мяч перемещался только тогда, когда мышь находится в пределах установленных границ. В программировании это означает, что мы должны задать условия и проверять их при каждой попытке перетаскивания мяча. Иначе говоря, нам нужен
Если мышь находится в пределах границ, перетаскивать экземпляр клипа basketball. В противном случае перетаскивание прекратить.
Мы должны создать такой скрипт, который будет постоянно выполнять такой mouseMove. Таким образом наш скрипт при любом перемещении мыши будет немедленно реагировать, позволяя или запрещая перетаскивание экземпляра клипа basketball.
Что ж, раз мы все обдумали – продолжаем.
leftBoundary = 60; rightBoundary = 490; topBoundary = 220; bottomBoundary = 360;

Эти переменные содержат наши граничные координаты по X и Y. Поскольку мы поместили эти строки в обработчик события load, переменные будут созданы лишь после того, как экземпляр клипа basketball появится в сцене – если рассудить, то это правильно, ведь пока мяча нет на сцене, не нужны и эти переменные.
Теперь мы создадим оператор if, который постоянно будет проверять положение мыши и разрешать перетаскивание, только если мышь находится в пределах границ (которые мы только что установили).
onClipEvent (mouseMove) {
if (_root._xmouse > leftBoundary _root._xmouse
< rightBoundary _root._ymouse > topBoundary _root._ymouse
< bottomBoundary) {
startDrag (this, true);
} else {
stopDrag ();
}
}
Наш оператор if, помещенный в обработчик события mouseMove, будет выполняться при каждом перемещении мыши.

Данный оператор if проверяет четыре условия. Если все они выполняются, перетаскивание происходит, если нет – перетаскивание прекращается. С четырьмя проверяемыми условиями все просто: текущие координаты мыши ( _root._xmouse и _root._ymouse ) сравниваются с установленными нами граничными координатами.
Давайте рассмотрим парочку возможных сценариев развития событий. Предположим, мышь оказалась в точке с координатами: по горизонтали ( _root._xmouse ) – 347, по вертикали ( _root._ymouse ) – 285. Подставим в оператор if эти значения, а также координаты наших границ, и получим:
if (347 > 60 347 < 490 285 > 220 285 < 390)
В этом случае результатом выражения будет true – ведь 347 больше 60 и меньше 490, а 285 больше 220 и меньше 390. Перетаскивание будет разрешено.
Возьмем другой случай. Предположим, мышь оказалась в точке с координатами 42 по горизонтали и 370 по вертикали. Подставляя эти значения в оператор if, получим:
if (42 > 60 42 < 490 370 > 220 370 < 390)
В этом случае результатом выражения будет false, поскольку выполнены не все части условия – 42 меньше 60.
Итак, если выражение startDrag(). У этого действия два параметра:
startDrag (объект перетаскивания, привязка к центру)
Поскольку этот скрипт присоединен к экземпляру клипа basketball, и перетаскивать мы собираемся этот самый экземпляр, в качестве объекта перетаскивания мы указываем this. Привязка к центру установлена в значение true – это значит, что при перетаскивании центр экземпляра basketball будет привязан к положению указателя мыши.
Совет Действие startDrag() – не единственный способ перемещения экземпляра вслед за мышью. В нашем скрипте мы могли бы заменить это действие такими строками:
this._x = _root._xmouse; this._y = _root._ymouse;
Эти две строки приведут к тому, что X и Y координаты экземпляра клипа будут в точности копировать координаты мыши, создавая эффект, как при перетаскивании. Преимущество такого метода в том, что он позволяет одновременно "перетаскивать" несколько экземпляров клипов, тогда как действием startDrag() можно перетаскивать только один экземпляр в каждый момент времени. В нашем случае этого достаточно, ведь нам нужно перетаскивать только баскетбольный мяч.
Если выражение false, выполняется действие stopDrag(), в результате чего перетаскивание прекращается. Поскольку данный оператор if выполняется при каждом перемещении мыши, процесс перетаскивания может то останавливаться, то вновь начинаться, в зависимости от текущего положения мыши.
Когда фильм запустится в среде тестирования, попробуйте перемещать мышь по "спортзалу". Когда мышь находится в пределах установленных нами границ, начинается перетаскивание, и мяч "прыгает" по площадке. Переместите мышь за пределы границ – и перетаскивание прекратится.
Можете оставить файл открытым, поскольку мы еще поработаем с ним в этом уроке.
Все, что мы сделали до сих пор, было подготовкой, а главное начнется в следующих упражнениях. В принципе, управлять громкостью звука в экземпляре клипа при помощи присоединенного объекта очень просто, однако наш подход к этому процессу будет в высшей степени динамическим.
Вы помните, что в первом упражнении этого урока мы создадим объект под именем и связали его с экземпляром клипа basketball. Данный экземпляр клипа содержит звукозапись, которая воспроизводится в момент удара мяча по полу. Изменение громкости данного объекта будет выглядеть так:
bounce.setVolume (70);
В этой строке скрипта использован метод setVolume(), который устанавливает для объекта связан с экземпляром клипа basketball, соответствующим образом изменится громкость всех звукозаписей на его монтажном столе. Вообще громкость можно менять от 0 (тишина) до 100 (100 процентов).
Впрочем, совсем не обязательно задавать громкость, как в этом примере, жестко запрограммированным значением; возможности
bounce.setVolume (myVariable);
В этой строке скрипта уровень громкости объекта зависит от значения переменной myVariable. Изменится значение myVariable – изменится и громкость объекта . Такой подход мы и используем в этом упражнении.
Посмотрев на фоновое графическое оформление этого проекта, то увидите, что оно сделано таким образом, чтобы создать эффект глубины зала. Стены как бы "сближаются" к дальней стене зала, а пол "поднимается", что и создает перспективу. На этом мы и собираемся строить наши звуковые эффекты: громкость объекта будет зависеть от позиции мяча по вертикали внутри нашего

Чтобы этого добиться, мы должны сделать две вещи. Во первых, нам нужно создать переменную и постоянно обновлять ее значение (которое должно быть от 50 до 100). Для
Для примера предположим, что вертикальная координата мыши равна 310. Из предыдущего упражнения мы знаем, что наша верхняя граничная координата равна 220, а нижняя – 360. В первой части нашей формулы мы определяем общую длину, то есть вертикальный размер нашей ограниченной области. Для этого мы из 360 (нижняя граница) вычитаем 220 (верхняя граница). 360 – 220 дает нам значение 140. Далее мы должны найти длину участка. Для этого мы вычитаем 220 (верхняя граница) из 310 (текущая координата мыши). Это дает нам результат 90 (310 – 220), то есть мышь находится на расстоянии 90 пикселей от
(90 / 140) * 100 = x (0,6428) * 100 = x x = 64,28 или 64,28%

Если предположить, что x – будет устанавливаться так:
bounce.setVolume (x);
Поскольку значение x в нашем примере равно 64,28, такая громкость и будет установлена для объекта . Так как мышь постоянно перемещается, значение x будет изменяться, а вместе с ним и громкость ударов мяча.
Однако с математикой пока не покончено. Используя нашу формулу, мы будем получать результаты в диапазоне от 0 до 100: 0 будет получаться, если мышь находится у
50 / 2 = 25 25 + 50 = 75
По нашей новой формуле мы преобразовываем значение 50 (среднее между 0 и 100) в 75 (среднее между 50 и 100). Еще пример:
20 / 2 = 10 10 + 50 = 60
И вновь мы видим, как значение 20 (пятая часть промежутка от 0 до 100) благополучно преобразована в 60 (одна пятая промежутка от 50 до 100).
Еще раз распишем логику наших рассуждений и действий по управлению громкостью.
Sound bounce .Что ж, теперь пора вставить все это в наш фильм.
Если вы не закрыли файл после выполнения предыдущего упражнения, продолжайте работать с ним.
boundaryHeight = bottomBoundary – topBoundary;

Этим мы создаем переменную boundaryHeight и присваиваем ей результат выражения bottomBoundary – topBoundary. Две строки скрипта, расположенные над этой, показывают, что bottomBoundary = 360 и topBoundary = 220. Если подставить это в нашу новую строку, получится
boundaryHeight = 360 – 220
или
boundaryHeight = 140
Это значение представляет собой вертикальный размер ограниченной области; оно нужно нам для вычисления процентных отношений, описанных выше.
Совет Конечно, можно было бы просто присвоить переменной boundaryHeight значение 140, но то, как сделали это мы – при помощи выражения – гораздо динамичнее. В этом случае, если понадобится изменить значение bottomBoundary или topBoundary, значение boundaryHeight изменится автоматически. В скриптах желательно как можно реже использовать жестко запрограммированные значения переменных; старайтесь, где только можно, применять выражения.
topToBottomPercent = ((((_root._ymouse - topBoundary) / boundaryHeight) * 100) / 2) + 50;

Эта строка создает переменную topToBottomPercent и присваивает ей результат выражения. Это выражение представляет собой ту самую формулу процентных отношений. Для вычислений требуется три динамических значения: _root._ymouse (текущая вертикальная координата мыши), topBoundary (ее значение равно 220) и boundaryHeight (значение равно 140). Многочисленные скобки обеспечивают правильный порядок вычислений. Порядок этот таков:
_root._ymouse - topBoundary.boundaryHeight.Следует упомянуть о двух важных моментах в отношении того, где находится эта строка скрипта. Во-первых, она находится в обработчике события mouseMove. А значит, почти при каждом перемещении мыши вычисляется выражение и переменная topToBottomPercent получает новое значение. Мы сказали почти, поскольку данная строка скрипта находится еще и внутри оператора if, который проверяет, находится ли мышь в пределах ограниченной нами области. Это значит, что значение этой переменной будет вычисляться и обновляться только в том случае, если мышь находится в пределах границ. Ведь значение переменной нужно нам для установки уровня громкости объекта , и мы совсем не хотим, чтобы громкость менялась, когда мышь находится за пределами ограниченной области.
bounce.setVolume(topToBottomPercent);
Эта строка просто устанавливает громкость объекта – в соответствии с текущим значением переменной topToBottomPercent. Значение этой переменной постоянно обновляется, то же будет происходить и с громкостью объекта .
Эта строка находится в обработчике события mouseMove, а также внутри оператора if следовательно, громкость объекта будет изменяться каждый раз, когда мышь перемещается в пределах ограниченной области.
this._xscale = topToBottomPercent; this._yscale = topToBottomPercent;
Эти две строки создают в нашем проекте дополнительный эффект. Используя текущее значение переменной topToBottomPercent, мы изменяем свойства _xscale и _yscale экземпляра клипа basketball (this). Благодаря этому одновременно с изменением громкости объекта будет изменяться размер мяча. Иными словами, изменение громкости создает звуковой эффект удаления или приближения мяча, а изменение размера мяча создает такой же визуальный эффект – для большего

Поскольку эти строки находятся в обработчике события mouseMove, а также внутри оператора if, следовательно, размер мяча будет изменяться лишь тогда, когда мышь перемещается в пределах ограниченной области.
Когда фильм запустится в среде тестирования, подвигайте мышь по "площадке". Когда мяч перемещается вверх (по экрану, а по площадке, значит вдаль), его размер уменьшается, звук ударов становится тише – как будто мяч действительно удаляется. При перемещении вниз по экрану размер мяча увеличивается, он стучит по полу громче, словно приближается.
Можете оставить файл открытым – мы еще продолжим работу с ним в этом уроке.
Если громкость звука создает ощущение расстояния, то нет ничего сложного – ну, например:
bounce.setPan (100);
Эта строка приведет к тому, что звук будет издавать только правая колонка. Баланс каналов объекта может иметь значения от -100 (только левый канал) до 100 (только правый канал); при значении 0 оба канала будут иметь равную громкость.

Как и метод setVolume(), метод setPan() тоже позволяет задавать значение баланса динамически, используя переменную:
bounce.setPan (myVariable);
В нашем упражнении мы так и поступим – используем для изменения баланса объекта переменную. Как и в предыдущем упражнении, эта переменная будет иметь значение, зависящее от положения мыши (и мяча) относительно центра. В данном случае значение будет от -100 до 100, то есть мы используем весь возможный диапазон значений баланса.

Чтобы этого добиться, мы должны:
Если мышь находится точно по центру, баланс будет устанавливаться на 0. Если мышь находится левее центра, значение баланса будет от -100 до 0; оно будет определяться как процентное отношение расстояния мыши от центра к общей длине левой половины. Таким же образом, если мышь находится правее центра, значение баланса будет от 0 до 100; оно будет определяться как процентное отношение расстояния мыши от центра к общей длине правой половины.
Думаю, тут вы не запутаетесь – ведь мы уже говорили (в предыдущем разделе) о том, как перевести подобные логические рассуждения на язык
Если вы не закрыли файл после выполнения предыдущего упражнения, продолжайте работать с ним.
boundaryWidth = rightBoundary – leftBoundary;
Этим мы создаем переменную boundaryWidth и присваиваем ей результат выражения rightBoundary – leftBoundary. Две строки скрипта, расположенные над этой, показывают, что rightBoundary = 490, а leftBoundary = 60. Если подставить это в нашу новую строку, получится
boundaryWidth = 490 – 60
или
boundaryWidth = 430
Это значение представляет собой горизонтальный размер ограниченной области; с его помощью мы определим размер правой и левой половин этой области.

quadrantSize = boundaryWidth / 2;
Эта строка создает переменную quadrantSize и присваивает ей результат выражения . Переменная boundaryWidth у нас равна 430. Значит, получится:
quadrantSize = 430/2
или
quadrantSize = 215
Теперь мы знаем размер каждой половинки и можем вычислить процентное отношение для установления баланса каналов объекта .

centerPoint = rightBoundary - quadrantSize;
Эта строка создает переменную centerPoint и присваивает ей результат выражения rightBoundary - quadrantSize. Переменная rightBoundary у нас равна 490, а quadrantSize имеет значение 215. Получаем:
centerPoint = 490 – 215
или
centerPoint = 275
Это значение – горизонтальная координата центра нашей ограниченной области, линия, по которой соприкасаются половинки. Данная переменная будет иметь важнейшее значение в процессе установки баланса, ведь именно она позволяет определить, в какой из половин области находится мышь, и в какую сторону следует смещать баланс объекта – влево или вправо. Если горизонтальная координата мыши ( _root._xmouse ) больше, чем centerPoint (275), мы знаем, что мышь находится в правой половине, если меньше – значит, в левой.
panAmount = ((_root._xmouse – centerPoint) / quadrantSize) * 100; bounce.setPan (panAmount);
В первой строке создается переменная panAmount. Выражение, определяющее значение этой переменной, построено на том же принципе, что и вычисление процентных отношений для громкости (в предыдущем упражнении).
Выражение построено так, что оно будет давать значения от -100 до 100. В следующей строке значение переменной panAmount используется для установки баланса объекта .
Чтобы вы лучше поняли, как работает эта часть скрипта, давайте рассмотрим пару возможных сценариев. Сначала предположим, что горизонтальная координата мыши ( _root._xmouse ) в момент panAmount равна 374. Подставляя в выражение также значения centerPoint (275) и quadrantSize (215), получаем следующее:
panAmount = ((374 – 275) / 215) * 100
или
panAmount = (99 / 215) * 100
или
panAmount = 0,4604 * 100
или
panAmount = 46,04
Как только значение panAmount определено, выполняется следующая строка скрипта. Эта строка устанавливает для объекта значение баланса, равное значению переменной panAmount, то есть, в данном случае, 46,04. Это приведет к тому, что правый канал будет звучать на 46,04 процента громче, чем левый, создавая эффект того, что баскетбольный мяч находится в правой части зала. Визуально мяч тоже будет находиться в правой части экрана, ведь горизонтальная координата мыши (374) больше, чем centerPoint (275), значит, мышь (а с ней и экземпляр клипа basketball ) находится на 99 пикселей (374 – 275) правее центра.
Рассмотрим другой случай. Предположим, что горизонтальная координата мыши равна 158. Подставив все нужные значения в наше выражение, получим:
panAmount = ((158 – 275) / 215) * 100
или
panAmount = (-117 / 215) * 100
или
panAmount = -0,5442 * 100
или
panAmount = -54,42
В этом сценарии panAmount получает отрицательное значение (-54,42). Это – результат вычитания 275 из 158, в самом начале вычислений. Поскольку 158 – 275 = -117 (отрицательное число), результат после деления и умножения тоже получается отрицательный – для нас это идеально, ведь для смещения баланса влево нам и нужно отрицательное значение. И вновь, как только вычислено значение panAmount, выполняется следующая строка скрипта. Она устанавливает для объекта значение баланса, равное значению переменной panAmount (-54,42). В результате левый канал будет звучать на 54,42 процента громче, чем правый, создавая эффект того, что баскетбольный мяч находится в левой части зала. Визуально мяч также будет находиться в левой части экрана – горизонтальная координата мыши (158) меньше, чем centerPoint (275), следовательно, мышь (а с ней и экземпляр клипа basketball ) находится на 117 пикселей (275 – 158) левее центра.
Если горизонтальная координата мыши равна значению centerPoint (275), выражение присвоит переменной panAmount значение 0, в результате чего оба канала, левый и правый, будут звучать одинаково. Мышь и мяч находятся при этом точно по центру.
Две добавленные нами строки находятся в обработчике события mouseMove, а также внутри оператора if, следовательно, баланс каналов объекта
Когда фильм запустится в среде тестирования, двигайте мышь по "площадке". Теперь при перетаскивании мяча меняется не только громкость, но и "положение" источника звука – он "смещается" то влево, то вправо.
Можете оставить файл открытым – мы еще продолжим работу с ним в этом уроке.
В нединамических проектах звукозаписи помещаются непосредственно на монтажный стол, и им управляются. Иными словами, если вы хотите, чтобы в фильме звучала некая звукозапись, вы должны перетащить ее из библиотеки на монтажный стол и обозначить, когда, как долго и сколько раз она должна воспроизводиться. Для многих проектов этого вполне достаточно, но мы-то с вами , позволяющих добавлять звукозаписи в фильм и управлять их воспроизведением, причем все это – "на лету".
Что самое замечательное, что можно сделать с созданным во ? Присоединить к нему звукозапись, то есть "вытащить" ее из библиотеки, и в дальнейшем воспроизводить ее и останавливать, когда заблагорассудится.
Но для этого сначала необходимо назначить библиотечным звукозаписям имена-идентификаторы. Если звукозапись имеет идентификатор, ее можно присоединить к объекту и затем управлять ее воспроизведением, а также громкостью и балансом, как мы делали ранее в этом уроке.
Например, предположим, что в библиотеке фильма имеется музыкальная звукозапись с именем-идентификатором "rockMusic". При помощи следующего кода мы можем динамически внедрить ее в проект и управлять воспроизведением:
on (release) {
music = new Sound ();
music.attachSound ("rockMusic");
music.start (0, 5);
}
Первая строка этого скрипта показывает, что он будет выполняться, когда отпущена после нажатия некая кнопка, к которой скрипт присоединен. При выполнении скрипта сначала создается новый объект типа под именем music. Затем к этому объекту присоединяется звукозапись "rockMusic" (из библиотеки). Следующая строка начинает проигрывание этого объекта – это значит, что начнется воспроизведение звукозаписи "rockMusic" (поскольку именно она присоединена к этому объекту). Первый параметр (0) в этом действии показывает, сколько секунд от начала звукозаписи следует пропустить. Например, предположим, что в "rockMusic" имеется гитарное соло, начинающееся на 20-й секунде. Тогда если вместо 0 мы подставим 20, то воспроизведение этой записи начнется не с начала, а прямо с этого гитарного соло. Второй параметр, который у нас равен 5, показывает, сколько раз следует повторить воспроизведение записи. В нашем случае звукозапись будет повторена пять раз, и лишь после этого остановится.
Добавим, что вместо конкретных значений параметров можно указывать имена переменных, что открывает широчайшие возможности.
В следующем упражнении мы покажем, как присоединить к объекту случайно выбранную из библиотеки звукозапись и запустить ее воспроизведение нажатием кнопки мыши. Число повторов звукозаписи тоже будет случайным. Кроме того, мы запрограммируем возможность остановки воспроизведения нажатием любой клавиши на клавиатуре.
Если вы не закрыли файл после выполнения предыдущего упражнения, продолжайте работать с ним.
В библиотеке имеется папка под названием . В этой папке вы найдете три звукозаписи, импортированные в проект. Эти звуковые клипы существуют только в библиотеке; ни на одном из монтажных столов проекта они не присутствуют.

Откроется диалоговое окно Свойства связи (Linkage Properties). Именно здесь мы можем присвоить звуковому клипу имя-идентификатор.

Примечание Подробно о настройках этого диалогового окна рассказано в Уроке 14 – Динамическое управление фильмами-символами.
Мы поставили в конце имени клипа цифру не просто так. Наш скрипт будет генерировать случайные числа от 0 до 2. Если выпадет 0, проигрывается звукозапись Sound0, если 1 – Sound1, если 2 – Sound2.
Присвоив идентификатор, нажмите кнопку OK.
Аудиоклипу присвойте идентификатор Sound1, а клипу – идентификатор Sound2.
Примечание Учтите, что имена библиотечных элементов могут содержать пробелы, а имена-идентификаторы – нет. Присваивая идентификаторы, следуйте тем же правилам, что и для имен переменных и объектов.
Итак, теперь мы имеем в библиотечной папке три звукозаписи с идентификаторами Sound0, Sound1 и Sound2. Пора использовать их в скриптах.
dynaSounds = new Sound();
Этим мы создаем новый объект под названием dynaSounds. Как и объект , этот объект будет создан, как только экземпляр клипа basketball будет загружен в сцену. Когда это случится, в нашем проекте будет два объекта типа , один из которых управляет звуком скачущего мяча, а другой (только что добавленный) будет случайным образом выбирать и воспроизводить один из трех библиотечных звуков.
Обратите внимание, что, создавая этот объект , мы не связали его с каким-либо монтажным столом. Наш новый объект будет ассоциирован со всем проектом – так сказать, "универсальный", "общий" объект .
onClipEvent (mouseDown) {
randomSound = random (3);
randomLoop = random (2) + 1;
dynaSounds.attachSound ("Sound" + randomSound);
dynaSounds.start (0, randomLoop);
}

Скрипт помещен в обработчик события mouseDown, и потому будет выполнен, если кнопка мыши будет нажата (в любом месте сцены). Вот что скрипт делает:
Во первых, действие генерирует случайное число от 0 до 2 и присваивает его переменной randomSound. Далее это случайное число будет определять, какая из библиотечных звукозаписей будет присоединена к объекту и затем проиграна.
В следующей строке нашего скрипта присваивается значение переменной randomLoop – тоже на основе случайного числа. Это значение будет определять, сколько раз должна быть воспроизведена звукозапись. Обратите внимание: здесь переменной присваивается не просто случайное число – мы к нему еще прибавляем единицу. Если этого не сделать, действие выдаст 0 либо 1. Присвоить переменной randomLoop значение 0 мы не можем – нельзя проиграть звукозапись "ноль раз". Поэтому мы прибавляем 1, и теперь переменная будет получать значение 1 (0+1) или 2 (1+1); таким образом, звукозапись будет проигрываться либо один раз, либо дважды.
Важный совет Этот прием можно использовать всякий раз, когда случайное число должно находиться внутри некоего диапазона, начинающегося не с нуля. Например, выражение ; будет генерировать случайные числа от 50 до 100. Вот в чем суть фокуса:
random () диапазон генерируемых чисел всегда начинается с 0.Сгенерированные нашим скриптом два случайных числа используются в двух оставшихся строках.
dynaSounds.attachSound ("Sound" + randomSound);
Это действие присоединяет к объекту dynaSounds библиотечную звукозапись, имя (идентификатор) которой получается в результате присоединения к строке " значения randomSound. Если, к примеру, randomSound равно 2, то мы получим следующее действие:
dynaSounds.attachSound ("Sound2");
При каждом щелчке мышью будет генерироваться новое случайное число и к объекту будет присоединяться соответствующая новая звукозапись.
Наконец, последняя строка скрипта воспроизводит этот объект :
dynaSounds.start (0, randomLoop);
Этим действием запускается проигрывание текущей присоединенной к объекту звукозаписи. Что касается двух параметров, то 0 означает, что запись должна воспроизводиться с самого начала, а значение randomLoop определяет число повторений записи (один раз или два).
onClipEvent (keyDown) {
dynaSounds.stop ();
}

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