2010-06-11 10 views
2

C'est la première fois que je pose une question ici.Flash AS3 bouton eventlistener tableau bug

J'ai un tableau de 12 boutons sur une timeline qui, lors de la première visite de cette partie de la timeline, obtient un événement CLICK eventlistener ajouté en utilisant une boucle for. Tous fonctionnent parfaitement à ce moment-là. Lorsque vous cliquez sur un, il lit une étiquette d'image à l'intérieur du clip movieClip spécifique et affiche une bio sur la personne correspondante avec un bouton de fermeture et supprime les CLICK eventlisters pour chaque bouton, en utilisant à nouveau une boucle for. Le bouton de fermeture joue une animation de fermeture, puis la ligne de temps revient à la première image (celle avec les 12 boutons) et les CLICK eventlisteners sont rajoutés, mais maintenant seuls les 9 premiers boutons du tableau fonctionnent. Il n'y a pas d'erreurs de sortie et le code pour rajouter les eventlisteners est exactement le même que la première fois que cela fonctionne. Je suis complètement perdu et je me demande si quelqu'un d'autre a rencontré ce problème. Tous mes boutons sont nommés correctement, il n'y a absolument aucune erreur de sortie (j'ai utilisé le module de débogage) et je me suis assuré que le tableau avec les boutons en sortie tous les 12 au moment où le bouton de fermeture est cliqué pour ajouter les eventlisteners.

for (var q = 0; q < ackBoDBtnArray.length; q++){ 
     contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[q]].addEventListener(MouseEvent.CLICK, showBio); 
    } 

    private function showBio(eo:MouseEvent):void { 
     trace("show the bio"); 
     bodVar = ackBoDBtnArray.getIndex(eo.target.name); 
     contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDPgArray[bodVar]); 
     contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.addEventListener(MouseEvent.CLICK, hideBio); 
     for (var r = 0; r < ackBoDBtnArray.length; r++){ 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].mouseEnabled = false; 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].removeEventListener(MouseEvent.CLICK, showBio); 
     } 
    } 
    private function hideBio(eo:MouseEvent):void { 
     trace("hide it!"); 
     contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.removeEventListener(MouseEvent.CLICK, hideBio); 
     contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDClosePgArray[bodVar]); 
     for (var s = 0; s < ackBoDBtnArray.length; s++){ 
      trace(ackBoDBtnArray[s]); 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].mouseEnabled = true; 
      contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].addEventListener(MouseEvent.CLICK, showBio); 
     } 

Merci d'avance pour toute aide que vous pouvez fournir et de perspicacité ... J'ai un léger sentiment que son quelque chose qui peut être évident pour une autre série d'yeux ... haha.

+0

Pour les trois derniers, que voit-on dans la trace du débogage? – phwd

+0

Pour quelle version flash exportez-vous? Si vous accédez à quelque chose sur un cadre, vous venez de gotoAndStop-ed .. il peut ne pas être accessible .. devrait faire une exception d'exécution si .. si vous stockez seulement des chaînes dans le tableau .. essayez de tracer des objets .. si certains d'entre eux non nul (encore une fois ... il devrait donner une exception d'exécution s'ils étaient .. mais rien d'autre ne me vient à l'esprit) – Antriel

Répondre

0

Il semble corriger que je devais simplement ajouter tous les Tche dynamiquement au lieu de les avoir sur la timeline. Toujours étrange cependant, merci à tous

0

Quelque chose qui me semble suspect est que vous supprimez l'écouteur d'événements de closeBio_btn au début de hideBio(). Essayez de placer cette ligne après la boucle for.

Je vais avoir du mal à justifier cette intuition, mais quelques théories sauvages qui ont traversé mon esprit sont:

  1. Ceci est une condition de course. Vous supprimez l'écouteur pour le gestionnaire à l'intérieur du gestionnaire lui-même, et comme le gestionnaire a été ajouté dynamiquement, le moteur d'exécution marque le gestionnaire pour la récupération de place. Lors du balayage suivant, le gestionnaire est supprimé - mais comme gotoAndPlay prend probablement une durée non significative, le gestionnaire est toujours dans la boucle for ajoutant des gestionnaires de clic quand il est tué et n'a ajouté que les 9 premiers à ce stade.
  2. Il s'agit d'un problème de corruption de données. Puisque le bouton hide et le tableau des 12 boutons sont au moins tangentiellement liés par BoD_mc, le runtime fait une étrange optimisation derrière les scènes qui rend l'accès aux objets via Bod_mc [avec index] peu fiable après que closeBio_btn a été touché.

Ceci est un problème intéressant, j'espère que vous trouverez une solution :)