0

Ich habe ein kleines Quäntchen. Ich muss eine Funktion in einem MovieClip aufrufen, sobald ein bestimmter Sound fertig ist. Der Sound wird über einen Soundkanal in einer externen Klasse gespielt, die ich importiert habe. Die Wiedergabe funktioniert einwandfrei.Sound Complete Not Firing (AS3)

Hier ist der relevante Code von meiner externen Klasse, Sonus.

public var SFXPRChannel:SoundChannel = new SoundChannel; 
var SFXPRfishbeg:Sound = new sfxpr_fishbeg(); 
var SFXPRfishmid:Sound = new sfxpr_fishmid(); 
var SFXPRfishend3:Sound = new sfxpr_fishend3(); 
var SFXPRfishend4:Sound = new sfxpr_fishend4() 

public function PlayPrompt(promptname:String):void 
{ 
    var sound:String = "SFXPR" + promptname; 
    SFXPRChannel = this[sound].play(); 
} 

Dies wird über einen Import in der Dokumentenklasse „OSR“ genannt, damit ich es in meinem Projekt über Zugang „osr.Sonus .---“

In meinem Projekt, ich habe folgende Codezeile.

osr.Sonus.SFXPRChannel.addEventListener(Event.SOUND_COMPLETE, promptIsFinished); 

function prompt():void 
{ 
    var level = osr.Gradua.Fetch("fish", "arr_con_level"); 
    Wait(true); 
    switch(level) 
    { 
     case 1: 
      osr.Sonus.PlayPrompt("fishbeg"); 
     break; 
     case 2: 
      osr.Sonus.PlayPrompt("fishmid"); 
     break; 
     case 3: 
      osr.Sonus.PlayPrompt("fishend3"); 
     break; 
     case 4: 
      osr.Sonus.PlayPrompt("fishend4"); 
     break; 
    } 
} 

function Wait(yesno):void 
{ 
    gui.Wait(yesno); 
} 

function promptIsFinished(evt:Event):void 
{ 
    Wait(false); 
} 

osr.Sonus.PlayPrompt (...) und gui.Wait (...), die beide perfekt funktioniert, wie ich sie in anderen Zusammenhängen in diesem Teil des Projektes ohne Fehler verwenden.

Grundsätzlich, nachdem der Sound beendet zu spielen, brauche ich warten (falsch); angerufen werden, aber der Ereignis-Listener scheint das SOUND_COMPLETE-Ereignis nicht zu "hören". Habe ich irgendwo einen Fehler gemacht?

Zur Erinnerung, aufgrund meiner Projektstruktur kann ich nicht die entsprechende Wait (...) Funktion aus Sonus aufrufen.

Hilfe?

Antwort

0

Event.SOUND_COMPLETE wird vom SoundChannel-Objekt ausgelöst, das von sound.play() zurückgegeben wird. Das bedeutet, dass Sie sound.play() zuerst aufrufen und dann den Listener hinzufügen müssen, und Sie müssen den Listener explizit nach jedes Mal, das Sie aufrufen, hinzufügen.

public function PlayPrompt(promptname:String):void 
{ 
    var sound:String = "SFXPR" + promptname; 
    SFXPRChannel = this[sound].play(); 
    SFXPRChannel.addEventListener(Event.SOUND_COMPLETE, promptIsFinished); 
} 

Dann in promptsIsFinished sollten Sie den Listener entfernen.

function promptIsFinished(evt:Event):void 
{ 
    evt.currentTarget.removeEventListener(evt.type, promptIsFinished); 
    Wait(false); 
} 
+0

Leider, wie ich schon sagte, kann ich Wait (false) nicht von innerhalb Sonus aufrufen. Ich denke, ich werde das selbst spielen müssen, indem ich eine ähnliche Funktion innerhalb des Projekts selbst verwende. Trotzdem danke. – CodeMouse92

+0

Nun, Sie müssen nicht unbedingt. Sie rufen PlayPrompt innerhalb dieser switch -Anweisung auf, und Sie können auch von diesem Bereich aus auf SFXPRChannel zugreifen, sodass Sie PlayPrompt innerhalb der switch-Anweisung aufrufen und den Listener unmittelbar nach der Ausführung des Switches hinzufügen können. – scriptocalypse

+0

Nun, nein, weil mein Projekt so eingerichtet ist, dass die Segmente in Filmclips sind, die versteckt und auf der Bühne gezeigt werden. Jeder hat ein "gui" -Objekt, das die Funktion enthält, auf die sich Wait (false) bezieht. Ich habe keine Möglichkeit zu wissen, welcher MovieClip an irgendeinem Punkt das Ziel dieses Wait (false) Signals sein wird, also das Problem. Trotzdem danke. – CodeMouse92