Дострочное пересдача экзамена
|
Звук и ActionScript
Управление балансом каналов
Если громкость звука создает ощущение расстояния, то панорама звука (баланс между левым и правым каналами) помогает определить положение источника звука относительно слушателя – левее или правее. Как и в случае с громкостью, в установке баланса каналов объекта Sound нет ничего сложного – ну, например:
bounce.setPan (100);
Эта строка приведет к тому, что звук будет издавать только правая колонка. Баланс каналов объекта Sound может иметь значения от -100 (только левый канал) до 100 (только правый канал); при значении 0 оба канала будут иметь равную громкость.
Как и метод setVolume(), метод setPan() тоже позволяет задавать значение баланса динамически, используя переменную:
bounce.setPan (myVariable);
В нашем упражнении мы так и поступим – используем для изменения баланса объекта Sound bounce переменную. Как и в предыдущем упражнении, эта переменная будет иметь значение, зависящее от положения мыши (и мяча) относительно центра. В данном случае значение будет от -100 до 100, то есть мы используем весь возможный диапазон значений баланса.
Чтобы этого добиться, мы должны:
- Определить размер по горизонтали нашей ограниченной области, в которой разрешено перетаскивание и затем разделить его на два, поделив ограниченную область на две равные половинки.
- Установить координату горизонтального центра.
- При каждом перемещении мыши определять ее положение (точно по центру, в левой или правой половине).
Если мышь находится точно по центру, баланс будет устанавливаться на 0. Если мышь находится левее центра, значение баланса будет от -100 до 0; оно будет определяться как процентное отношение расстояния мыши от центра к общей длине левой половины. Таким же образом, если мышь находится правее центра, значение баланса будет от 0 до 100; оно будет определяться как процентное отношение расстояния мыши от центра к общей длине правой половины.
Думаю, тут вы не запутаетесь – ведь мы уже говорили (в предыдущем разделе) о том, как перевести подобные логические рассуждения на язык ActionScript; здесь нам нужно будет только слегка адаптировать их.
- Откройте файл basketball4.fla из папки Lesson16/Assets.
Если вы не закрыли файл после выполнения предыдущего упражнения, продолжайте работать с ним.
- Выделите экземпляр клипа basketball, откройте панель Действия. После строки скрипта boundaryHeight = bottomBoundary – topBoundary; вставьте следующую строку:
boundaryWidth = rightBoundary – leftBoundary;
Этим мы создаем переменную boundaryWidth и присваиваем ей результат выражения rightBoundary – leftBoundary. Две строки скрипта, расположенные над этой, показывают, что rightBoundary = 490, а leftBoundary = 60. Если подставить это в нашу новую строку, получится
boundaryWidth = 490 – 60
или
boundaryWidth = 430
Это значение представляет собой горизонтальный размер ограниченной области; с его помощью мы определим размер правой и левой половин этой области.
- После строки скрипта boundaryWidth = rightBoundary – leftBoundary; вставьте следующую строку:
quadrantSize = boundaryWidth / 2;
Эта строка создает переменную quadrantSize и присваивает ей результат выражения boundary-Width / 2. Переменная boundaryWidth у нас равна 430. Значит, получится:
quadrantSize = 430/2
или
quadrantSize = 215
Теперь мы знаем размер каждой половинки и можем вычислить процентное отношение для установления баланса каналов объекта Sound bounce.
- После строки скрипта quadrantSize = boundaryWidth / 2; вставьте следующую строку:
centerPoint = rightBoundary - quadrantSize;
Эта строка создает переменную centerPoint и присваивает ей результат выражения rightBoundary - quadrantSize. Переменная rightBoundary у нас равна 490, а quadrantSize имеет значение 215. Получаем:
centerPoint = 490 – 215
или
centerPoint = 275
Это значение – горизонтальная координата центра нашей ограниченной области, линия, по которой соприкасаются половинки. Данная переменная будет иметь важнейшее значение в процессе установки баланса, ведь именно она позволяет определить, в какой из половин области находится мышь, и в какую сторону следует смещать баланс объекта bounce – влево или вправо. Если горизонтальная координата мыши ( _root._xmouse ) больше, чем centerPoint (275), мы знаем, что мышь находится в правой половине, если меньше – значит, в левой.
- После строки скрипта centerPoint = rightBoundary - quadrantSize; вставьте следующие строки:
panAmount = ((_root._xmouse – centerPoint) / quadrantSize) * 100; bounce.setPan (panAmount);
В первой строке создается переменная panAmount. Выражение, определяющее значение этой переменной, построено на том же принципе, что и вычисление процентных отношений для громкости (в предыдущем упражнении).
Выражение построено так, что оно будет давать значения от -100 до 100. В следующей строке значение переменной panAmount используется для установки баланса объекта Sound bounce.
Чтобы вы лучше поняли, как работает эта часть скрипта, давайте рассмотрим пару возможных сценариев. Сначала предположим, что горизонтальная координата мыши ( _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 определено, выполняется следующая строка скрипта. Эта строка устанавливает для объекта Sound bounce значение баланса, равное значению переменной 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, выполняется следующая строка скрипта. Она устанавливает для объекта Sound bounce значение баланса, равное значению переменной panAmount (-54,42). В результате левый канал будет звучать на 54,42 процента громче, чем правый, создавая эффект того, что баскетбольный мяч находится в левой части зала. Визуально мяч также будет находиться в левой части экрана – горизонтальная координата мыши (158) меньше, чем centerPoint (275), следовательно, мышь (а с ней и экземпляр клипа basketball ) находится на 117 пикселей (275 – 158) левее центра.
Если горизонтальная координата мыши равна значению centerPoint (275), выражение присвоит переменной panAmount значение 0, в результате чего оба канала, левый и правый, будут звучать одинаково. Мышь и мяч находятся при этом точно по центру.
Две добавленные нами строки находятся в обработчике события mouseMove, а также внутри оператора if, следовательно, баланс каналов объекта bounce будет изменяться каждый раз, когда мышь перемещается в пределах ограниченной области.
- Командой Управление > Проверить фильм (Control > Test Movie) запустите тест фильма.
Когда фильм запустится в среде тестирования, двигайте мышь по "площадке". Теперь при перетаскивании мяча меняется не только громкость, но и "положение" источника звука – он "смещается" то влево, то вправо.
- Закройте тестовый фильм и вернитесь в среду разработки. Сохраните файл под именем basketball5.fla.
Можете оставить файл открытым – мы еще продолжим работу с ним в этом уроке.