PDA

Просмотр полной версии : Многократное воспроизведение звука и остановка


Vasil
24.04.2012, 19:39
Доброго времени суток.
Есть короткая мелодия, которая при нажатии кнопки начинает проигрываться до тех пор (или очень долго), пока второй раз не нажать эту кнопку.
Кривым языком начинающего (у меня) это должно выглядеть так

btn.addEventListener(MouseEvent.CLICK, playsound);
function playsound(e:MouseEvent):void {

if(temp==1)
{ sound.stop(0,3000);
temp=0;
}else{
sound.play(0,3000);
temp=1;
}
}

Но так оно естественно не работает :( Подскажите, как сделать такое действие. пробовал создавать и удалять листенеры с функцией многократного воспроизведения, но тоже к успеху не пришел

bublic_bicubic
24.04.2012, 19:49
не совсем правильно понимаете как работает Sound, SoundChannel.
рекомендую почитать документацию
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play()


//var sound:Sound; звук, который надо воспроизводить

btn.addEventListener( MouseEvent.CLICK, toggleSound );
var soundChannel:SoundChannel = null;

function toggleSound( e:MouseEvent = null ):void {
if( soundChannel ) {
soundChannel.stop();
soundChannel = null;
} else {
soundChannel = sound.play( 0, 3000 );
}
}

Vasil
24.04.2012, 20:32
Спасибо, работает :)
таким способом нельзя сделать воспроизведение сразу двух звуков или я не правильно понял?

bublic_bicubic
24.04.2012, 20:38
можно.
для каждого звука свой SoundChannel

Vasil
24.04.2012, 21:01
так почему то не получается...

btn.addEventListener(MouseEvent.CLICK, playsound);
var soundChannel1:SoundChannel = null;
var soundChannel2:SoundChannel = null;
function playsound(e:MouseEvent):void {

if(temp==1)
{ soundChannel1.stop();
soundChannel1 = null;
soundChannel2 = sound2.play( 0, 3000 );
temp=0;
}else{
soundChannel2.stop();
soundChannel2 = null;
soundChannel1 = sound1.play( 0, 3000 );
temp=1;
}
}

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
если же после else будет

soundChannel1 = sound1.play( 0, 3000 );
soundChannel2.stop();
soundChannel2 = null;

то работать будет только один звук и выключить его не удастся
если же воспроизведение засунуть в одни скобки, а стоп в другие, то работают вместе и отключаются тоже

bublic_bicubic
25.04.2012, 11:38
не могу понять какое поведение требуется. нужно чтобы оба звука одновременно включались и выключались или попеременно?

Vasil
25.04.2012, 16:55
попеременно. при нечетном нажатии включается sound1, при четном sound2

bublic_bicubic
25.04.2012, 17:05
Тогда в вашем коде при первом запуске функции playsound произойдет ошибка. Нужно либо при первом запуске обработать это, либо включать один из звуков в начале работы приложения.

В данном случае нужен один SoundChannel (так как звук проигрывается только один)
//var sound1:Sound, sound2:Sound; звуки, которые надо воспроизводить

btn.addEventListener( MouseEvent.CLICK, toggleSound );
var soundChannel:SoundChannel = null; // канал, изначально звук не проигрывается
var currentSound:Sound = null; // текущий звук, изначально не задан

function toggleSound( e:MouseEvent = null ):void {
switch ( currentSound ) {
case null: // если звук еще не проигрывается, выбираем первый звук
case sound2: // если проигрывается второй звук, выбираем первый звук
currentSound = sound1;
break;
case sound1: // если проигрывается первый звук, выбираем второй звук
currentSound = sound2
break;
}
if ( soundChannel ) { // если сейчас проигрывается звук, останавливаем его
soundChannel.stop();
}
soundChannel = currentSound.play( 0, 3000 ); // включаем проигрывание нового звука
}

Vasil
25.04.2012, 18:12
спасибо Вам огромное :) очень помогли