PDA

Просмотр полной версии : Подскажите пожалуйста по FadeOut AS2.0


MSergey
15.02.2010, 22:05
На кнопке стоит функция - StopAllSounds(); Она останавливает любой звук в ролике, жестко обрывая его. Можно ли сделать так, чтобы при нажатии на кнопку звук не обрывался, а затухал плавно?

mooncar
15.02.2010, 22:23
btn.onRelease = function () {
fadeout = setInterval (fadeOut , 100);
};

function fadeOut () {
if (!allSound) {
allSound = new Sound();//скобки пусты, значит этот экземпляр класса Sound влияет на весь звук ролика
}

if (count == undefined) {
count = 10;
}

if (count >= 0) {
allSound.setVolume(count * 10);
count--;
}
else {
clearInterval(fadeout);
}
}

Тут в 10 шагов (каждый шаг - раз в 100 мс) уводится в 0 громкость всех звуков в ролике.
Если нужно опять стартовать какой-то звук, то нужно будет поднять всю громкость до 100 объекта allSound и только тогда стартовать нужный звук.
Если так поступать нежелательно, то нужна несколько другая схема работы со звуком, зависящая от конкретных обстоятельств - откуда и как стартуются звуки, сколько их и пр.

Вот так то же самое, но покороче:
btn.onRelease = fadeOut;

function fadeOut () {
fadeout ? null : fadeout = setInterval (fadeOut , 100);
allSound ? null : allSound = new Sound(); //скобки пусты, значит этот экземпляр класса Sound влияет на весь звук ролика
count == undefined ? count = 10 : null ;

if (count > 0) {
count--;
allSound.setVolume(count * 10);
}
else {
clearInterval(fadeout);
}
}

MSergey
15.02.2010, 22:40
Спасибо за ответ. У меня почему-то не получается применить этот код. Вероятно, я что-то не так делаю.

я изначально написал в action-button:

on(release){
StopAllSounds();
}

И при нажатии на кнопку звук выключался. Такс.. а теперь мне нужно этот код удалить и скопировать туда тот код, который Вы написали? правильно?

mooncar
15.02.2010, 22:43
Неправильно. Никаких записей на кнопках и мувиках! Запомните - код пишется только в кадре. Это уже стандарт де-факто, и не просто так.

Называете вашу кнопку на сцене btn, код пишете в AS кадра и все заработает.

MSergey
15.02.2010, 22:54
Хорошо. Запомнил. Вставил, всё работает! А как теперь вернуть звук по нажатию кнопки?

Добавлено через 34 минуты
Просто ситуация такая, нужно чтобы во время нажатия звук тянулся. А когда мышку отпускаешь - чтобы звук затихал. То есть, покакнопка нажата - звук идёт. Когда отпускаешь кнопку - звук затихает.

Сейчас звук пока затихает безвозвратно)))

mooncar
15.02.2010, 23:43
Не понятно - что значит тянулся "во время нажатия"? Мгновенный старт с начала при нажатии? Вывод плавный из нуля, и при этом с любого места?

MSergey
16.02.2010, 00:22
Ну, я не знаю на каком примере лучше показать принцип. Вот например, пианино. Нажимаешь клавишу - звук тянется. Отпускаешь клавишу - звук быстро затихает. Вот такой нужен принцип. Кнопка нажимается - стартует файл, кнопка держится - файл звучит, кнопка отпускается - файл затихает. Потом, если снова нажать на кнопку, стартует тот же файл и всё то же самое. Вот, вроде такой принцип.

mooncar
16.02.2010, 00:36
Помучаю вас еще. У пианино несколько клавиш, это раз. Клавиши могут звучать одновременно, но каждый отдельно от другого, это два. А тут весь звук убирается для всего сразу.
Почитайте о классе Sound. Посмотрите примеры....Спрашивайте, что не получается.
Можно сделать многое.

Кстати, не "файл должен звучать", а экземпляр класса Sound.
Например, если нужно управлять звуками раздельно, то

this.createEmptyMovieClip('fa_mc', this.getNextHighestDepth());
this.createEmptyMovieClip('mi_mc', this.getNextHighestDepth());
var fa:Sound = new Sound (fa_mc);
var mi:Sound = new Sound (mi_mc);
fa.attachSound('fa_id'); //из библиотеки
mi.attachSound('mi_id'); //из библиотеки

//и где нужно
fa.start();
mi.start();

Добавлено через 6 минут
Сделайте на onPress старт звука, а на onRelease - затухание, тогда будет то что вы хотите.

mooncar
16.02.2010, 01:49
Вот пример, как можно сделать старт звука при нажатии на кнопку и его быстрое затухание при отпускании.
Тут можно сделать много звуков. Все данные, включая сами экземпляры Sound, находятся в двумерном массиве.
Сами звуки аттачатся из библиотеки.
Сравните, как звучит звук до самого конца, если не отпускать кнопку и как он быстро затухнет, если отпустить.

Код:
var sounds:Array = new Array(); //двухмерный массив для всего, что связано со звуками
//В дальнейшем:
//sounds[n]['sound'] - сам экземпляр класса Sound
//sounds[n]['count'] - счетчик, соответсвтвенный уровню затухания соотв. звука
//sounds[n]['fadeOut'] - интервал, соотвестствующий интервальной функции затухания соотв. звука :)

for (i = 1; i < 3; i++) {
//работа со звуками
sounds[i] = new Array(); //вспомогательный массив , нужен для эмуляции двумерности
var mc:MovieClip = this.createEmptyMovieClip('s' + i + '_mc', this.getNextHighestDepth()); //создаем мувик для звука
sounds[i]['sound'] = new Sound (mc); //создаем экземпяр звука
sounds[i]['sound'].attachSound('s' + i + '_id'); //из библиотеки аттачим соотв. звук

//работа с кнопками
var btn:MovieClip = this['s' + i + '_btn'];
btn.num = i; //сохраняем номер внутри кнопки
btn.onPress = startPlay;
btn.onRelease = fadeOut;
btn.onDragOut = fadeOut;
}

function startPlay() {
var n:Number = this.num;
clearInterval(sounds[n]['fadeOut']);
sounds[n]['sound'].start(); //стартуется звук, соотв. номеру n
sounds[n]['sound'].setVolume(100); //выставляем громкость 100%
sounds[n]['count'] = 10; //полный по громкости звук - начальное состояние счетчика
}


function fadeOut() {
n = this.num;
sounds[n]['fadeOut'] = setInterval (fadeOutProcess, 50, n); //начинаем процесс затухания, внося номер имнетрвала в массив
}

function fadeOutProcess (n:Number) {
if (sounds[n]['count'] > 0) {
sounds[n]['count']--;
sounds[n]['sound'].setVolume(sounds[n]['count'] * 10);
}
else {
clearInterval(sounds[n]['fadeOut']); //останавливаем процесс просчета соответственного затухания
}
}


PS. Там в исходнике для 2 звуков в цикле нужно тоже 3 проставить, если что.
PPS. Конечно же, если хотите, чтобы проигрывались внешние mp3-шки, то вместо аттача из либы нужно сделать загрузку типа
sounds[i]['sound'].loadSound('s' + i + '.mp3');
Ну и использовать обработчики событий onLoad, чтобы проверить готовность звуков для проигрывания, и тогда разрешать все остальные действия.