2010-09-01 5 views
0

J'ai une application simple avec un film chargeant un autre fichier SWF dans le même domaine. Je peux accéder aux variables et aux fonctions dans le fichier SWF chargé, mais je ne peux pas écouter les événements à partir d'un bouton. recevoir l'erreur d'exécution: Erreur # 1009: Impossible d'accéder à une propriété ou méthode d'un objet null référenceÉcouter des événements à partir d'un fichier SWF chargé?

Les propriétés de liaison du bouton sont mis

principal

var assetLoader:Loader = new Loader(); 
assetLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete); 
assetLoader.load(new URLRequest("home.swf"); 

function loadingComplete(evt:Event):void { 
... 
var asset:MovieClip = assetLoader.content as MovieClip; 
asset.homeTrace("function in loaded SWF"); 
trace("var in loaded SWF:", asset.lastFrame); 
// Error #1009 
asset.enterApp.addEventListener(MouseEvent.CLICK, homeButtons); 
... 
} 

Accueil

var lastFrame:Boolean = false; 

function homeTrace(p1:String) { 
    trace(p1); 
} 

Merci à l'avance

Répondre

0

J'ai implémenté une solution, pas ce que je voulais, mais ça fonctionne bien. Comme je ne suis pas en mesure d'ajouter des écouteurs pour les boutons dans le film chargé, j'ai ajouté un général et utilisé un interrupteur pour distinguer l'objet de l'expéditeur:

asset.addEventListener(MouseEvent.CLICK, homeButtons); 
... 
function homeButtons(evt:MouseEvent):void { 
    switch(evt.target.toString()) { 
    case "[object Send]": 
     nextScreen(evt); 
     break; 
    case "[object Enter]": 
     tmpEnter(evt); 
     break; 
    } 
} 
0

que vous publiez une solution régulière, mais si vous regardez plus profond vous pouvez trouver une solution comment ajouter des écouteurs d'événements here et lire à propos de l'architecture entière here.

Cordialement
Eugene

+0

Je vais regarder de plus près les publications du forum Adobe. En ce qui concerne l'article sur le blog de gskinner, c'est une solution basée sur Flex et j'utilise Flash IDE. Et oui, vous avez raison, en regardant plus loin, vous pouvez même trouver de l'huile ou de l'or! Le problème est de savoir où regarder! ;-) – hsands

0

Le problème pourrait être que vous la coulée du « actif » comme MovieClip, il pourrait bien être un Sprite. Il est préférable de mettre le tout dans un try .. catch ou if juste au cas où de toute façon, et le mouler au type de sécurité * pour éviter les erreurs de compilation (ou si vous voulez aller dans toute la maison utiliser une interface et fusionner les deux contextes applicationDomain, mais des thats un sujet vaste)

function loadingComplete(evt:Event):void { 
    ... 
    var asset:* = assetLoader.content; 
    if(asset != null){ 
     try{ 
     connectModule(asset); 
     }catch(err:Error){ 
     trace("Error accessing module functions", err.getStackTrace()); 
     } 
    }else{ 
     trace("No module"); 
    } 
} 

function connectModule(module:*):void{ 
    trace("Using typeof", typeof(module), "using constructor", module.constructor, "has the function?", module['homeTrace'] != null); 
    module.homeTrace("Function load in swf"); 
    ... 
} 

les déclarations contenues dans traceconnectModule devraient vous donner quelques informations de débogage supplémentaire pour vous aider à déterminer quel type d'objet est chargé et si elle a ou non la fonction que vous essayez d'accéder. Faites-moi savoir si cela fonctionne pour vous.

+0

@ user61466: désolé pour le retard et merci pour votre temps! Je vais essayer votre suggestion par simple curiosité, mais les fichiers SWF que je charge sont des films Flash simples avec des animations de timeline, quelques boutons simples et un stop() dans la dernière image. Donc, je ne vois pas comment ils pourraient être quelque chose de différent d'une instance MovieClip – hsands

+0

@hsands: Ah désolé, ce n'est pas important alors. Erreur: 1009 est une référence d'objet nul, c'est-à-dire la chose à laquelle vous accédez n'est pas là, je remarque que c'est juste avant 'asset.enterApp' cela signifie que quel que soit' enterApp' est, il n'est pas là. S'il s'agit d'un MovieClip sur la scène, il y a quelques retards de rendu avec le lecteur Flash qui les empêcheraient d'être sur scène immédiatement. Il est préférable d'attendre une trame avec 'addEventListener' (ou setTimeout si vous avez besoin de quelque chose de hacky) jusqu'à ce que' enterApp' soit rendu. – enzuguri

Questions connexes