AS3 SoundChannel stop() не работает
У меня есть класс SoundHandler со следующими переменными:
private static var musicChannel: SoundChannel;
private static var effectsChannel: SoundChannel;
private static var narrationChannel: SoundChannel;
private static var narrationMuted:Boolean;
В функции инициализации:
var classReference: Class = getDefinitionByName(narrationClassName) as Class;
var s: Sound = new classReference();
narrationChannel = s.play();
Эффекты и музыкальные каналы работают нормально, но канал повествования не останавливается при вызове stop(). Вот функция:
public static function playNarration(narrationClassName: String): void {
if (!narrationMuted) {
narrationChannel.stop(); //NOT WORKING--THE SOUND KEEPS PLAYING!
var classReference: Class = getDefinitionByName(narrationClassName) as Class;
var s: Sound = new classReference();
narrationChannel = s.play();
}
}
SoundMixer.stopAll () останавливает звук повествования, но я не могу его использовать, потому что он также останавливает музыку и звуковые эффекты.
Я подозреваю, что stop() не работает из-за того, как я создаю объект Sound, но я не уверен. Внешняя загрузка не решает проблему:
public static function playNarration(narrationClassName: String): void {
if (!narrationMuted) {
narrationChannel.stop();
var s: Sound = new Sound();
s.addEventListener(Event.COMPLETE, onNarrationSoundLoaded);
var req: URLRequest = new URLRequest("sounds/Narration/sub_narr_1.mp3");
s.load(req);
}
}
private static function onNarrationSoundLoaded(e: Event): void {
var localSound: Sound = e.target as Sound;
narrationChannel = localSound.play();
}
Сохранение повествования звучит как статические переменные, также не работает:
private static var subNarr1:Sound;
public static function playNarration(narrationClassName: String): void {
if (!narrationMuted) {
narrationChannel.stop();
narrationChannel = subNarr1.play();
}
}
Любая помощь приветствуется. Спасибо!
1 ответ
Я предполагаю, что ваша функция инициализации вызывается дважды. Каждый раз, когда вы звоните narrationChannel = s.play();
Вы теряете ссылку на предыдущий экземпляр.
Например, если вы делаете это:
narrationChannel = s.play(); //narrationChannel points to what we'll call "instance 1"
narrationChannel = s.play(); //narrationChannel points to what we'll call "instance 2"
narrationChannel.stop(); //you just stopped 'instance 2' but 'instance 1' is still playing
Попробуйте - добавьте команды трассировки при каждом запуске или остановке s
или же narrationChannel
в любом месте вашего кода:
trace("Остановка канала!");
narrationChannel.stop();
var classReference: Class = getDefinitionByName(narrationClassName) as Class;
var s: Sound = new classReference();
trace("Воспроизведение нового звука в канале!")
narrationChannel = s.play();
Сделайте это в своей функции инициализации, а также воспроизведите повествование и везде, где вы запускаете или останавливаете звук или канал. Я подозреваю, что вы увидите это в выводе вашей консоли:
Playing new sound in the channel!
Playing new sound in the channel!
Stopping the channel!
а это значит, вам просто нужно отследить, как s.play()
вызывается дважды narrationChannel.stop()
Я могу быть совершенно неправ, но это кажется мне наиболее вероятным объяснением.