Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Подскажите пожалуйста по FadeOut AS2.0 (http://www.flasher.ru/forum/showthread.php?t=136370)

MSergey 15.02.2010 22:05

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

mooncar 15.02.2010 22:23

Код AS1/AS2:

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 и только тогда стартовать нужный звук.
Если так поступать нежелательно, то нужна несколько другая схема работы со звуком, зависящая от конкретных обстоятельств - откуда и как стартуются звуки, сколько их и пр.

Вот так то же самое, но покороче:
Код AS1/AS2:

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.
Например, если нужно управлять звуками раздельно, то
Код AS1/AS2:

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

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

Код:
Код AS1/AS2:

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-шки, то вместо аттача из либы нужно сделать загрузку типа
Код AS1/AS2:

sounds[i]['sound'].loadSound('s' + i + '.mp3');

Ну и использовать обработчики событий onLoad, чтобы проверить готовность звуков для проигрывания, и тогда разрешать все остальные действия.


Часовой пояс GMT +4, время: 23:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.