in AS3, removeEventListener(Event.ENTER_FRAME) nicht funktioniert
Beschäftige ich mich mit diesem problem seit Tagen schon. Ich bin mit meinem Latein am Ende!
Ich kann nicht scheinen zu finden, eine definitive Antwort irgendwo auf einem der Foren, Dokumentation, etc.
Sieht alles gut aus auf den ersten laufen, oder wenn ich es laden ein Nächstes level für die Benutzer, um zu spielen. Aber wenn der Benutzer hat die ESC-Taste zum laden einer anderen Ebene, die enterFrame-listener nicht entfernt zu bekommen und es Duplikate aller Trigger in, zeigen die Spieler gehen wirklich schnell, und alle funky, denn es baut auf der zuvor instanziiert enterFrame-listener.
Ich weiß nicht, ob ich ein problem habe von einen anonymen Funktion, oder eine unbekannte Instanz verwiesen wird, in meinem removeEvent... Kommando... - Bottom-line, ich gebe auf und ich brauche diese Arbeit HILFE!!!!!
Hier der code:
function initPlay():void
{
//code here determining what display object to add to the list and assign it to the currentLevel variable (a movieclip)
if(userIsLoadingOtherLevel){
removeEnterFrameListener();
addChild(currentLevel);
}
if(userIsGointToNextLevel)
addChild(currentLevel);
currentLevel.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event):void
{
//collision detection, parallax scrolling, etc, etc is done here.
if(allCoinsCollected)
loadNextLevel();
if(ESCKeyPressed)
ESCKeyPressHandler();
}
function loadNextLevel():void
{
removeChild(currentLevel);
newLevelToLoad++
removeEnterFrameListener();
initPlay();
}
function ESCKeyPressHandler():void
{
removeChild(currentLevel);
initPlay();
}
function removeEnterFrameListener();
{
currentLevel.removeEventListener(Event.ENTER_FRAME,onEnterFrame)
trace("currentLevel.hasEventListener(Event.ENTER_FRAME) = "+currentLevel.hasEventListener(Event.ENTER_FRAME)); //outputs TRUE if called from loadNextLevel but FALSE if called from initPlay() !!!
}
}
Ich habe auch versucht, hinzufügen und entfernen der eventListener der Bühne, MovieClip(Root), oder gar nichts und das Ergebnis ist immer das gleiche.
Ich weiß, dass es andere Möglichkeiten der Gestaltung solcher Prozess, aber bitte beachten ich bin nicht wirklich flexibel, im moment tut dies, weil das Projekt sehr lange (über 4000 Zeilen code) und entfernen Sie die ENTER-FRAME diese Weise verrückt ist oder nicht, sollte immer noch funktionieren!!
Vielen DANK im Voraus für alle die bereit sind zu helfen.
Ich habe das Gefühl auch, dass das, was passiert ist, dass das ENTER_FRAME-Ereignis-Listener wird angebracht, um alle Kinder des currentLevel-display-Objekt und wenn ich es entfernen, hinzufügen einer anderen Ebene, bleibt es immer noch in einigen der currentLevel Kinder, oder so ähnlich. Ich denke, dies kann geschehen, weil nach dem laden eines neuen level der Spieler noch kollidiert mit "unsichtbaren" Objekten wahrscheinlich noch vorhanden, von der vor ...
Ja, Pan, das funktioniert Prima. Ich habe nur ein problem, wenn ich die ESCKeyPress handler. Es funktioniert einfach nicht entfernen!
Ist der obige code korrekt? Ich Frage, weil du scheinst der Definition von Funktionen innerhalb der
initPlay()
Funktion. Syntax Weise, das ist vollkommen OK. Aber logisch, ist es vielleicht ein Teil des Problems. Vielleicht ist es nur ein Tippfehler, und Sie vergessen zu einfügen/geben Sie eine schließende Klammer...Die
trace()
- Anweisung ist eine tolle debugging-tool. Setzen trace()
- Anweisungen am Anfang jeder Methode. Dann läuft dein code in beiden Szenarien (wenn es funktioniert und wenn es scheitert). Vergleichen Sie die Ausgabe der trace-Anweisungen und du wirst vielleicht sehen, wo die Dinge gehen drunter und drüber. Ihre aktuelle Arbeit, um bis Ende Mai, beißen Sie später zu performance-Problemen w/mit einem Bündel von enterFrame-Listener ausgeführt wird.
InformationsquelleAutor Leo Perez | 2013-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint das problem zu sein, das verschachtelte Funktionen in der
initPlay()
Methode.Jedes mal, wenn Sie anrufen
initPlay()
Sie definieren neue Funktionen. Einige dieser verschachtelte Funktionen aufrufeninitPlay()
selbst.Funktionen sind Objekte (Speicher-Referenzen). Also jedes mal, wenn Sie anrufen
initPlay()
Sie machen neue Hinweise auf neue Funktionen. Also, wenn Sie versuchen, entfernen Sie einen Ereignis-listener, du bist nur in der Lage, entfernen Sie eines dieser event-Handler (die im Geltungsbereich der aktuellen Ausführung).Ich bin nicht sicher, wenn ich erkläre das ganz klar, vielleicht diesem Beispiel zu helfen. Ich werde das verwenden von zahlen zur Darstellung der Referenzen zu jeder Funktion und ein einfaches Szenario, dass ist ähnlich wie bei Ihnen:
Wenn wir diese Funktion das erste mal eine neue Funktion definiert, die im Rahmen der
example()
Funktion. Ermöglicht die Verwendung der Nummer 1 zu vertreten, wird der Verweis auf dieses verschachtelte Funktion.someCondition
isttrue
auf das erste mal um, und so dieexample()
Funktion erneut aufgerufen wird.Auf die zweite Ausführung der
example()
Funktion, eine neue Referenz auf die Maus-event-handler (#2). Wir auch noch die event-listener wieder. An dieser Stelle gibt es zwei event-handling-Funktionen im Speicher, und beide werden ausgeführt, wenn das Ereignis ausgelöst wird.Lassen Sie uns sagen, dass in der zweite Aufruf von
example()
dasssomeCondition
istfalse
und nun wollen wir den listener entfernen. Wenn wir rufen:Bezieht es sich auf event-handler #2. Event-handler #1 noch vorhanden ist, und weil Sie verborgen ist, in den Anwendungsbereich der erste Aufruf von
example()
es nicht entfernt werden kann, hier.Mein einfaches Beispiel bricht nach... aber ich hoffe es macht klar, warum Ihre event-Handler sollten nicht geschachtelt werden innerhalb einer Funktion. Zugegeben, das ist schwer zu beschreiben und noch mehr in einer realen Welt-Beispiel wie deine. Aber ich bin mir ziemlich sicher, dass dies die Quelle der meisten, wenn nicht alle die Probleme, die Sie beschreiben.
Durch die Art und Weise, mit verschachtelten Funktionen für event-Handler (oder auch anonyme Funktionen) ist OK, aber nicht, wenn die Logik kompliziert wie in Ihrer situation. Das ist, wo es besser sein wird, um zu bewegen, die Funktionen auf den "äußeren" Rahmen, so dass es keine Verwirrung über das, was Hinzugefügt/entfernt.
Tatsächlich machte Sie auch Sinn. Was werde ich tun, dann ist verschieben der verschachtelte Funktionen außerhalb, es sei denn, es ist unbedingt notwendig, Sie zu verlassen verschachtelt. Dies sollte vereinfacht auch andere Aufgaben während der Entwicklung. Mein temporärer fix für das hinzufügen der aus scope-variable fest, da es mir erlaubt, entfernen Sie den Ereignis-handler bilden die "enter frame" selbst, aber es scheint viel zu kompliziert für das was es tut... vielen DANK @SunilD !! Es wird eine Weile dauern, sich zu bewegen alle Funktionen, außerhalb, und eine Menge von null-Referenzen kann das pop-up, weil es, aber ich denke es lohnt sich für Einfachheit
InformationsquelleAutor Sunil D.
Hier, wie ich in der Lage war, dies zu umgehen, ohne dass der Umfang der verschachtelten Funktionen (auch wenn ich damit einverstanden wäre das die bevorzugte Lösung), indem Sie eine Boolesche variable mit dem Namen "loadingNewGame" und ändern Sie den Wert true aus, die außerhalb der onEnterFrame (in der Tat, diese Aufgabe war getan von initPlay() und dann aus onEnterframe ich rief removeEnterFrameListener () - Funktion. Dies hat den trick.
hier der code, falls jemand interessiert ist:
InformationsquelleAutor Leo Perez