PDA

Просмотр полной версии : Замудренный запуск звука по нажатию на клипы


КорДум
21.10.2009, 18:50
Здравствуйте, давно сюда не заходил - все дела... В универе попросили сделать презентации по темам, да еще и не просто, а со звуком. Сел вечером создавать функцию проигрывания звука. Нажимался клип - звук проигрывался, нажимался снова - звук останавливался. Затем я попробовал сделать два клипа и два звука. Все заработало. Но вот не так, как мне надо. При нажатии на первый клип срабатывал первый звук. При нажатии на второй клип первый звук затыкался, второй не стартовал.
Можно ли как-то сделать, чтобы при нажатии на второй клип проигрывался второй звук, а первый переставал играть? Заранее спасибо

Вот код:
var vsound:Sound = new Sound();
function startStopMus(nameSnd){
if (!onOff){
onOff = true;
vsound.attachSound(nameSnd);
vsound.start(nameSnd);
} else {
onOff = false;
vsound.stop();
}
}

btn1.onRelease = function(){
startStopMus("1.mp3");
}
btn2.onRelease = function(){
startStopMus("2.mp3");
}

lexa2000lexa
21.10.2009, 19:21
создавайте два обьекта Sound , и с каждым работайте.

КорДум
21.10.2009, 20:10
Спасибо за идею, но ежели этих звуков больше, чем два? Скажем, десятка два-три. Конечно, я сейчас попробую что-то сварганить с двумя объектами, но хотелось бы услышать еще варианты решения)

Добавлено через 3 часа 44 минуты
немного переделал функцию. Теперь останавливается одна и играет вторая. Вот только вообще остановить проигрывание нельзя - обязательно играет какая-то из мелодий:
var vsound:Sound = new Sound();

function startStopMus(nameSnd, nmBtn) {
if (!onOff){
vsound.stop();
nmBtn.onOff = true;
vsound.attachSound(nameSnd);
vsound.start(nameSnd);
} else {
nmBtn.onOff = false;
vsound.stop();
}
}

btn1.onRelease = function() {
startStopMus("1.mp3", btn1);
}
btn2.onRelease = function() {
startStopMus("2.mp3", btn2);
}

amexdesign
22.10.2009, 00:25
примерно вот так:
var mp3:Array = new Array("sound", "sound1", ... "sound20");// Sound`s лежат в библиотеке и соответственно инициализированны для экспорта в ActionScript
var btn:Array = new Array(btn1, btn2, ... btn20);//Button`s лежат на рабочем столе в первом фрэйме
function startStopMus(btnID){
var vsound:Sound = new Sound();
vsound.attachSound(mp3[btnID]);
vsound.start(mp3[btnID]);
vsound.stop(mp3[btnID - 1]);
vsound.stop(mp3[btnID + 1]);
}

for(var i = 0; i < btn.length; i++){
var item = btn[i];
item.ID = i;
item.onRelease = function(){
startStopMus(this.ID);
}
}

КорДум
22.10.2009, 00:40
amexdesign, интересная реализация. Только вот в ней, если нажать несколько раз на одну и ту же кнопку, звук, запускаемый с этой кнопкой, дублируется и накладывается сам на себя...

Можно составить вот такую конструкцию:
if (vsound.start(mp3[btnID])) { //если этот звук играет
vsound.stop(mp3[btnID]);
}
? Знаю, что в скобках неправильное выражение, но можно ли его как-то примерно написать?

amexdesign
22.10.2009, 00:58
тогда избигаем это следующим образом:
var mp3:Array = new Array("sound", "sound1", ... "sound20");// Sound`s лежат в библиотеке и соответственно инициализированны для экспорта в ActionScript
var btn:Array = new Array(btn1, btn2, ... btn20);//Button`s лежат на рабочем столе в первом фрэйме
var count:Number = -1;
function startStopMus(btnID){
var vsound:Sound = new Sound();
vsound.attachSound(mp3[btnID]);
vsound.start(mp3[btnID]);
vsound.stop(mp3[btnID - 1]);
vsound.stop(mp3[btnID + 1]);
}

for(var i = 0; i < btn.length; i++){
var item = btn[i];
item.ID = i;
item.onRelease = function(){
if (count != this.ID){
count++;
startStopMus(this.ID);
}
}
}

КорДум
22.10.2009, 01:02
и опять промах) Теперь звук не останавливается вообще - это раз. И если проиграть первый звук, затем второй, а после этого снова первый - первый звук можно снова дублировать - это два) Сейчас попробую флагами одолеть это...
Обязательно отпишу, даже если не получилось

Добавлено через 5 минут
отлично, заработало! Теперь ваша функция приобрела следующий вид:

function startStopMus(btnID){
var vsound:Sound = new Sound();
vsound.attachSound(mp3[btnID]);

if (!btn[btnID].enbl){
vsound.start(mp3[btnID]);
btn[btnID].enbl = true;
} else {
vsound.stop(mp3[btnID]);
btn[btnID].enbl = false;
}

vsound.stop(mp3[btnID - 1]);
vsound.stop(mp3[btnID + 1]);

btn[btnID - 1].enbl = false;
btn[btnID + 1].enbl = false;

}

Большое спасибо)

Добавлено через 13 часов 31 минуту
хе, добавил на сцену еще парочку кнопкоклипов и в библиотеку парочку звуков, решил проверить свою догадку. Оказалось, точно - если запустить первый звук, а затем четвертый - они накладываются друг на друга. Вот здесь недочет:
vsound.stop(mp3[btnID - 1]);
vsound.stop(mp3[btnID + 1]);
btn[btnID - 1].enbl = false;
btn[btnID + 1].enbl = false;


исправил вот так:
function startStopMus(btnID){
var vsound:Sound = new Sound();
vsound.attachSound(mp3[btnID]);

if (!btn[btnID].enbl){
vsound.start(mp3[btnID]);
btn[btnID].enbl = true;
} else {
vsound.stop(mp3[btnID]);
btn[btnID].enbl = false;
}
if (btnID != btn.length-1){
for(j = btnID+1; j <= btn.length-1; j++){
vsound.stop(mp3[j]);
btn[j].enbl = false;
}
}
if (btnID != 0){
for(j = btnID-1; j >= 0; j--){
vsound.stop(mp3[j]);
btn[j].enbl = false;
}
}
}