Форум 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)
-   -   Замудренный запуск звука по нажатию на клипы (http://www.flasher.ru/forum/showthread.php?t=131485)

КорДум 21.10.2009 18:50

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

Вот код:
Код AS1/AS2:

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 минуты
немного переделал функцию. Теперь останавливается одна и играет вторая. Вот только вообще остановить проигрывание нельзя - обязательно играет какая-то из мелодий:
Код AS1/AS2:

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

примерно вот так:
Код AS1/AS2:

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

Можно составить вот такую конструкцию:
Код AS1/AS2:

if (vsound.start(mp3[btnID])) {  //если этот звук играет
        vsound.stop(mp3[btnID]);
}

? Знаю, что в скобках неправильное выражение, но можно ли его как-то примерно написать?

amexdesign 22.10.2009 00:58

тогда избигаем это следующим образом:
Код AS1/AS2:

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 минут
отлично, заработало! Теперь ваша функция приобрела следующий вид:

Код AS1/AS2:

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 минуту
хе, добавил на сцену еще парочку кнопкоклипов и в библиотеку парочку звуков, решил проверить свою догадку. Оказалось, точно - если запустить первый звук, а затем четвертый - они накладываются друг на друга. Вот здесь недочет:
Код AS1/AS2:

vsound.stop(mp3[btnID - 1]);
vsound.stop(mp3[btnID + 1]);
btn[btnID - 1].enbl = false;
btn[btnID + 1].enbl = false;

исправил вот так:
Код AS1/AS2:

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;
                }
        }
}



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

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