en AS3, removeEventListener(Event.ENTER_FRAME) ne fonctionne pas

J'ai eu affaire à ce problème depuis des jours déjà. Je suis à mon esprit " fin!
Je n'arrive pas à trouver une réponse définitive n'importe où sur l'un des forums, de la documentation, etc.

Tout semble parfait à la première exécution, ou lorsque je charge un niveau supérieur pour l'utilisateur de jouer. Mais si l'utilisateur appuie sur la touche ÉCHAP pour charger un autre niveau, le CADRE d'ENTRÉE de l'écouteur n'est pas supprimé et il reprend tous les déclencheurs, montrant le joueur va vraiment vite, et tous les funky, car il repose sur le dessus de la déjà instancié CADRE d'ENTRÉE de l'auditeur.

Je ne sais pas si j'ai un problème d'une fonction anonyme, ou un inconnu instance d'être référencées dans mon removeEvent... commande... Bas de ligne, je donne et j'ai besoin de cette AIDE de travail!!!

Voici le 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() !!!
}
}

J'ai aussi essayé d'ajouter et de supprimer l'eventListener à la scène, MovieClip(Racine), ou rien du tout et le résultat est toujours le même.

Je sais qu'il peut y avoir d'autres façons de concevoir un tel processus, mais s'il vous plaît noter je ne suis pas vraiment souple au moment de le faire, car le projet est très long (environ 4000 lignes de code) et de supprimer le CADRE d'ENTRÉE de cette façon, à la folie ou pas doivent encore travailler!!

MERCI d'avance pour tous ceux qui sont prêts à aider.

Cela fonctionne si vous utilisez loadNextLevel au lieu de ESCKeyPressHandler?
J'ai le sentiment aussi que ce qui se passe est que le ENTER_FRAME Écouteur d'Événement sont attachées à tous les enfants de la currentLevel Objet d'affichage, et lorsque je le supprime pour ajouter un autre niveau, il reste encore dans certains currentLevel Enfants, ou quelque chose comme ça. Je pense que cela peut se produire parce que, après le chargement d'un nouveau niveau, le joueur est toujours en conflit avec "l'invisible" objets probablement encore présent à partir de l'avant ...
Oui Pan, qui fonctionne très bien. Je n'ai qu'un problème quand j'utilise le ESCKeyPress gestionnaire. Il n'a tout simplement pas l'enlever!
Est le code ci-dessus est correcte? Je demande parce que vous semblez être de définir des fonctions à l'intérieur de la initPlay() fonction. Syntaxe sage, c'est parfaitement OK. Mais, logiquement, il peut-être une partie de votre problème. Peut-être que c'est juste une faute de frappe, et vous avez oublié de coller/type dans un crochet de fermeture...
Le trace() déclaration est un excellent outil de débogage. Mettre trace() consolidés au début de chaque méthode. Puis exécutez votre code dans les deux scénarios (quand il fonctionne correctement et quand il tombe en panne). Comparez le résultat que vous obtenez à partir des instructions de suivi et vous allez peut-être voir où en sont les choses aller détraque. Votre travail en cours autour de la fin mai jusqu'à vous mordre plus tard, en causant des problèmes de performance w/avoir un tas de cadre d'entrée auditeurs en cours d'exécution.

OriginalL'auteur Leo Perez | 2013-09-03