Flash AS3 Звук воспроизводится после удаления фрагмента ролика с помощью removeChild - PullRequest
2 голосов
/ 14 марта 2012

Итак.Без размещения тонны кода.По сути, я импортирую несколько звуков в мой FLA-файл во Flash CS5, используя ActionScript3.

У меня есть созданные звуковые каналы и экземпляры звуков, созданные в основном классе.

В функции конструктора у меня есть первая сцена, созданная с помощью addChild.Я также инициализирую звук фоновой музыки через звуковой канал.

Проблема в том, что я хочу, чтобы звуковой эффект воспроизводился на кадре 40 этой первой сцены.Если я просто поместил звук на временную шкалу, которую он воспроизводит, но после удаления сцены для вставки сцены 2 этот звуковой эффект продолжает воспроизводиться.Я также пытался использовать actioncript в кадре 40 для воспроизведения звука, но он также зацикливается после removeChild.

Как правильно сделать это?Я бы предпочел оставить весь код в основном классе, но если мне нужно добавить сценарий в отдельные сцены, я готов к этому.ПРОСТО ЖЕЛАЮ, ЧТО Я МОГУ ПОЛУЧИТЬ ЗВУК, ЧТОБЫ ОСТАНОВИТЬ ЗАКРЫТИЕ !!!

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Вам нужно будет использовать SoundChannel.stop() на любом экземпляре SoundChannel, который отвечает за рассматриваемый звук.

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

1 голос
/ 09 апреля 2012

У меня была такая же проблема, мой родительский клип загружал ребенка со звуком, в кадре которого было несколько кадров (оно было отложено).Удаление ребенка только удаляло просмотренную сцену, но звук продолжал зацикливаться.Я вставил этот код в кадры, в которых воспроизводился звук в дочернем мувиклипе, и все было исправлено:

if (this.stage == null) {
    SoundMixer.stopAll();
}

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

0 голосов
/ 14 марта 2012

removeChild не несет ответственности за остановку любых звуков, он только удаляет displayObject из дочернего списка, удаляя его визуально.

Если вы хотите остановить звук, который вы начали, вам понадобится ссылка натот SoundChannel при вызове removeChild.Затем просто используйте SoundChannel.stop () http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundChannel.html#stop()

Мне понадобится дополнительная информация, чтобы дать более точный ответ.

Вы сказали, что один из вариантов, который вы пробовали, - это воспроизведение звука изнутривременная шкала, на кадре 40. Тогда проблема в том, что если displayObject уже был удален, он все еще воспроизводится.В этом случае, которое не является моим любимым решением, но оно должно работать, вы можете сделать это:

// on frame 40
if (this.stage != null) {
  // play sound here 
}

Что означает, что сцена этого displayObject существует (если он все еще находится на сцене, то есть был добавлен какребенок и еще не был удален), тогда код внутри выполняется.Если вдруг удалить, звук будет по-прежнему играть.Вам по-прежнему нужна ссылка на SoundChannel, чтобы остановить его.Если изнутри объекта вы можете использовать addEventListener(Event.REMOVED_FROM_STAGE, func), чтобы узнать, когда объект был удален, и выполнить код SoundChannel.stop внутри указанной функции.

- Редактировать: Действительно, правильный способ сделать это не в реальной временной шкале

Когда вы создаете объект, добавьте к нему событие:

myObjectWithSoundInside.addEventListener(Event.REMOVED_FROM_STAGE, objRemoved)

function objRemoved (event:Event):void {
  // This is where you SoundChannel.stop()
}

Затем, когда вы выполните removeChild(myObjectWithSoundInside), звук должен прекратиться, если предположить, что внутренний код objRemoved правильный и на него хорошо ссылаются.

...