Проблема с потоковым звуком Flash: звук воспроизводится несколько раз только при смене кадра

Итак, вот в чем дело: я делаю игру-викторину и решил поставить к ней саундтрек. Это один аудиофайл, который я загрузил в свой личный домен и транслировал через код. Я также добавил кнопки воспроизведения/паузы, чтобы проигрыватель, очевидно, мог воспроизводить и приостанавливать музыку. Музыка автоматически воспроизводится на кадре 1, где находится кнопка «Пуск» моей игры. Однако, если игрок неправильно отвечает на вопрос, он возвращается к первому кадру. Проблема в том, что начинает воспроизводиться другой «экземпляр» музыки, в результате чего одновременно воспроизводится 2 музыки. Если он снова ответит неправильно, будет три воспроизведения музыки и т. д.... мне нужен какой-то прослушиватель событий, который предотвратит это... Как видите, я уже пытался использовать логический метод, но он не работает. не работает... Вот код, который я использовал для потоковой передачи:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var lastPosition:Number = 0;// pause button
mySound.load(new URLRequest("http://trollfacequiz.16mb.com/MusicFiles/Goat%20Songs.mp3"));
var soundIsPlaying:Boolean = false;
//mySound.play();
myChannel = mySound.play();

btn_mute.pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void
{
    lastPosition = myChannel.position;
    myChannel.stop();
    soundIsPlaying = false;
}
btn_mute.play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void
{
    if (soundIsPlaying == false)
    {
        myChannel = mySound.play(lastPosition);
        soundIsPlaying = true;
    }
}

btn_mute — это символ видеоклипа, который содержит кнопки воспроизведения и паузы. btn_pause — кнопка паузы. btn_play — это, очевидно, кнопка воспроизведения. Кнопка паузы находится поверх кнопки воспроизведения, поэтому, когда она становится невидимой, она «становится» кнопкой воспроизведения...


person Pedro Mendes    schedule 24.10.2014    source источник


Ответы (1)


Я думаю, что основная проблема заключается в вашей структуре кода и размещении кодов во фреймах, и самый короткий способ решить проблему — использовать SoundMixer.stopAll();

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var lastPosition:Number = 0;// pause button
mySound.load(new URLRequest("http://trollfacequiz.16mb.com/MusicFiles/Goat%20Songs.mp3"));
var soundIsPlaying:Boolean = false;
//mySound.play();
SoundMixer.stopAll();
myChannel = mySound.play();

btn_mute.pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void
{
    lastPosition = myChannel.position;
    myChannel.stop();
    soundIsPlaying = false;
}
btn_mute.play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void
{
    if (soundIsPlaying == false)
    {
        myChannel = mySound.play(lastPosition);
        soundIsPlaying = true;
    }
}
person Mehdi Golzadeh    schedule 27.10.2014
comment
Спасибо, работает как шарм xD У меня только один вопрос: почему soundMixer.stopAll не сбрасывает звук? потому что, если кадр введен, звуковой микшер останавливает все звуки, а затем myChannel = mySound.play() воспроизводит его, теоретически сбрасывая звук... - person Pedro Mendes; 27.10.2014
comment
Вы имеете в виду, что в случае неправильного ответа звук продолжает воспроизводиться с последней позиции?? возможно, это могло бы помочь mySound.play(0); - person Mehdi Golzadeh; 27.10.2014
comment
Я думаю, вы ошиблись, ваш код работает отлично, я просто хотел знать, почему soundMixer.stopAll не сбросил звук, потому что я думал, что это произошло... - person Pedro Mendes; 28.10.2014
comment
нет, это просто останавливает все предыдущие звуки, когда вы возвращаетесь к этому кадру. и ваш код снова запускает новый звук. ваш предыдущий код не останавливает предыдущий звуковой объект, поэтому у вас был дублированный звук. - person Mehdi Golzadeh; 28.10.2014