15
фев
  Синхронизация звука   10 баллов
 

Вопрос следующий: Представте...сидит оркестр, как сделать, что бы при нажатии на любой инструмент он начинал исполнять
свою партию!А если на следующие другие, то они должны включаться в том же месте где играет первый!!!

Комментарии (1)   Автор: Дмитрий
Комментарии
admin
18.02.09 | 23:59
2 балла

У меня была как-то подобная необходимость. Тут принцип такой:

1) Перед запуском звука, считываем с помощью свойства .position у звука, который сейчас играет, на какой миллисекунде он сейчас проигрывается.
2) Останавливаем звук, который играет сейчас.
3) Запускаем новый звук с позиции, на которой у нас находился предыдущий звук.

В принципе вот и всё =) Архив с проектом вот тут: www.flashist.ru/files/help/sound_start_play_from_time.rar

В принципе, можно не качать архив, если создать в .fla 2 кнопки с именами sound1_mc и sound2_mc, а в библиотеке создать 2 звука и прописать им в Linkage имена sound1 и sound2. Желательно, чтобы оба звука были равной длины.

А в коде прописать следующее:

Stage.scaleMode = "noScale";
Stage.align = "TL";
//
var my1_sound:Sound = new Sound(this.sound1_mc);
my1_sound.attachSound("sound1");
var my2_sound:Sound = new Sound(this.sound2_mc);
my2_sound.attachSound("sound2");
//Делаем, чтобы когда мелодия начинала проигрываться заново при окончании
my1_sound.onSoundComplete = my2_sound.onSoundComplete=function () {
	this.start();
};
//Создаём переменную, в которую будем запоминать, какой сейчас играет звук
var current_sound:Sound;
//Запоминаем, какой звук соответствует какой кнопке
this.sound1_mc.var_sound = my1_sound;
this.sound2_mc.var_sound = my2_sound;
//
//Создаём обработчик события onRelease, каждый раз при его срабатывании
//будет запускаться функция _root.changeCound_func, в которую будет
//передаваться параметр this.var_sound. Эти параметры мы присвоили кнопкам
//чуть выше
this.sound1_mc.onRelease = this.sound2_mc.onRelease = function() {
	_root.changeCound_func(this.var_sound);
};
//
function changeCound_func(new_sound:Sound) {
	trace("Запускаем новый звук");
	//Создаём переменную, в которую будем запоминать, на какой позиции сейчас
	//находится играющий звук
	var _soundPos:Number
	//Если до этого какой-нибудь звук был запущен, то присваеваем позицию,
	//на которой находится этот звук переменной
	if(_root.current_sound){
		_soundPos = _root.current_sound.position;
	}else{
		//Если никакого звука до этого не было запущено, то начинаем
		//проигрывание с 0
		_soundPos = 0;
	}
	trace("Начинаем проигрывать с позиции "+_soundPos);
	//Останавливаем предыдущий звук
	_root.current_sound.stop();
	//Включаем следующий звук. Деление на 1000 нужно потому, что свойство position задаётся в
	//миллисикундах, а в фукнцию start время старта проигрывания передаётся в секундах.
	new_sound.start(_soundPos/1000);
	//Запоминаем новый звук, в переменной current_sound, потому что теперь
	//он проигрывается
	_root.current_sound = new_sound;
}

Надеюсь, мой пример поможет =)

 
 
 
 

Последние комментарии

Полезные ссылки

Реклама сайтов