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.

Funktioniert es, wenn Sie loadNextLevel statt ESCKeyPressHandler?
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

Schreibe einen Kommentar