1

J'essaye de charger un SWF local puis d'attraper quelques événements qui sont déclenchés mais je ne vois pas pourquoi cela ne fonctionne pas.AS2: Comment utiliser addEventListener sur un SWF/MovieClip chargé via MovieClipLoader

Voici le code

Parent.swf

_mcl = new MovieClipLoader(); 
_mcl.addListener(this); 
_mcl.loadClip("Child.swf", rotator_mc); 

function onLoadComplete(clip) { 
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 1")}); 
} 

function onLoadInit(clip) { 
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 2")}); 
} 

enfant.swf

import mx.events.EventDispatcher; 

function dispatchEvent() {}; 
function addEventListener() {}; 
function removeEventListener() {}; 

EventDispatcher.initialize(this); 

trace("Child dispatching: childLoaded"); 
dispatchEvent({type:"childLoaded", target: this}); 

Maintenant, j'espérais que cela fonctionnerait, et le parent aurait "pris childLoaded 2" dans la trace, mais ce n'est pas le cas.

Y a-t-il un moyen de réaliser ce que j'essaie de faire?

Répondre

2

La première chose que j'ai remarquée était le fait que dans le parent vous liez pour un événement appelé initAsLoaded mais dans l'enfant que vous envoyez un événement appelé childLoaded. Écouter un événement qui ne sera jamais distribué pourrait ne pas être une bonne idée.

Toutefois, ce n'est pas le problème réel, car la résolution des événements ne résout pas le problème. Le principal problème est que l'événement onLoadInit du MovieClipLoader est distribué après le le code de la première image de child.swf a été exécuté. Cela signifie que dans child.swf vous distribuez un événement sur la première image que personne n'écoute aussi car le onLoadInit n'a pas encore été appelé.

Pour résoudre ce problème, vous ne pouvez commencer à distribuer des événements dans child.swf qu'à partir de la seconde image et à partir de la seconde.

Parent première image:

var rotator_mc = _root.createEmptyMovieClip("rotator_mc", _root.getNextHighestDepth()); 

_mcl = new MovieClipLoader(); 
_mcl.addListener(this); 
_mcl.loadClip("child.swf", rotator_mc); 

function onLoadComplete(clip) { 
    trace("onLoadComplete " + clip + ", " + clip.addEventListener); 
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 1")}); 
} 

function onLoadInit(clip) { 
    trace("onLoadInit " + clip + ", " + clip.addEventListener); 
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 2")}); 
} 

Ceci est ma version de la première image de votre parent. J'ai dû créer un clip vide pour servir de conteneur et j'ai ajouté quelques traces aux gestionnaires d'événements.

enfant première image:

import mx.events.EventDispatcher; 

EventDispatcher.initialize(this); 

enfant deuxième cadre:

stop(); 

this.dispatchEvent({type:"initAsLoaded", target: this}); 

trace("Child dispatching: childLoaded"); 

Hope this helps ...

+0

Merci beaucoup, qui a résolu mon problème. Toutes mes excuses pour l'exemple inventé :) –

Questions connexes