2011-05-19 4 views
0
package com.fladev.background 
{ 
    //import all classes 
    import caurina.transitions.Tweener; 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    import flash.display.MovieClip; 
    import flash.display.Sprite; 
    import flash.display.DisplayObject; 
    import flash.display.StageAlign; 
    import flash.display.StageDisplayState; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.events.FullScreenEvent; 
    import flash.events.MouseEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 


public class MainClass extends Sprite 
{ 
    //create variables 
    private var loaderMenu:Loader; 
    private var loaderNames:Array = new Array(); 
    private var loaderContents:Array = new Array(); 
    private var loaderSlide:Loader; 
    private var swfDisplayObject:DisplayObject; 
    private var swfComObject:Object; 
    private var xmlLoader:URLLoader = new URLLoader(); 
    private var xmlSlideLoader:URLLoader = new URLLoader(); 

    public function MainClass() 
    { 
     stage.align = StageAlign.TOP_LEFT; 
     stage.scaleMode = StageScaleMode.NO_SCALE;   
     stage.addEventListener(Event.RESIZE, stageResize); 

     xmlLoader.addEventListener(Event.COMPLETE, showXML); 
     xmlLoader.load(new URLRequest("navigation.xml")); 

     //xmlSlideLoader.addEventListener(Event.COMPLETE, showSlideXML); 
     //xmlSlideLoader.load(new URLRequest("slides.xml")); 
    } 

    function showXML(e:Event):void 
    { 
     XML.ignoreWhitespace = true; 

     var menuBtns:XML = new XML(e.target.data); 
     var i:Number = 0; 

     for (i = 0; i < menuBtns.navItem.length(); i++) 
     { 
      loaderMenu = new Loader(); 
      loaderMenu.name = menuBtns.navItem[i].name ; 
      loaderMenu.load(new URLRequest(menuBtns.navItem[i].swfURL)); 
      loaderMenu.contentLoaderInfo.addEventListener(Event.COMPLETE, createSwfObjects); 
     } 
    } 

    private function createSwfObjects(event:Event):void 
    { 
     var swfContent = event.currentTarget.content as MovieClip ; 
     var swfName = event.currentTarget.loader ; 

     navigationContainer.addChild(event.target.loader); 
     showImage(swfContent); 

     if (swfName.name == 'topNavigation') 
     { 
      swfContent.addEventListener("clickHandle",topNavigationClickHandler); 
     } 
    } 

    private function topNavigationClickHandler():void 
    { 
     trace('Back to root'); 
    } 

    private function showImage(navigationItem):void 
    { 
     try 
      {      
       navigationItem.alpha = 0; 
       Tweener.addTween(navigationItem, { alpha:1, time:1, transition:"easeOutSine" });    
       navigationItem.smoothing = true;       

      } catch (e:Error) { trace('Error no tweening'); }; 

     stageResize(); 
    } 

    private function stageResize(e:Event=null):void 
    { 
     var centerImages:Array = new Array (contentContainer, navigationContainer, backgroundImage) ; 

     backgroundImage.x = 0; 
     backgroundImage.y = 0; 
     backgroundImage.scaleX = backgroundImage.scaleY = 1;    

     if ((stage.stageHeight/stage.stageWidth) < backgroundImage.height/backgroundImage.width) { 
      backgroundImage.width = stage.stageWidth; 
      backgroundImage.scaleY = backgroundImage.scaleX; 
     } else { 
      backgroundImage.height = stage.stageHeight;    
      backgroundImage.scaleX = backgroundImage.scaleY; 
     } 

     for each (var centered:MovieClip in centerImages) 
     { 
      centered.x = stage.stageWidth/2 - centered.width/2; 
      centered.y = stage.stageHeight/2 - centered.height/2; 
     } 
    } 
} 
} 

Ceci est mon code pour le main.as.événement Dispatching ne se déclenche pas :(

Et voici mon code pour mon SWF chargé sur le maintimeline.

addEventListener(Event.ADDED_TO_STAGE, init); 

function init(event:Event):void 
{ 
    trace('try dispatch'); 
    dispatchEvent(new Event("clickHandle",true)); 
} 

travaux d'expédition Try , mais il ne revient pas au principal feu vers le haut « Retour à la racine ». Toute idée?

thx!

Répondre

1

Tant que tous les événements d'envoi de MovieClips sont ajoutés à la liste d'affichage, cela devrait fonctionner. Cela me fait penser que peut-être l'écouteur d'événement ajouté ne fonctionne pas. Essayez d'ajouter une instruction trace au bloc de code comme indiqué ci-dessous:

if (swfName.name == 'topNavigation') 
{ 
    trace("adding listener"); 
    swfContent.addEventListener("clickHandle",topNavigationClickHandler); 
} 

Je pense que cela si la condition est un échec, et donc votre auditeur n'est jamais créé. En outre, vous devez ajouter un paramètre de fonction à la méthode de rappel "topNavigationClickHandler" pour accepter l'événement en tant que paramètre de rappel. Vous n'avez pas fait cela, et c'est une erreur qui serait lancée à l'exécution lorsque l'événement a été reçu et distribué à la méthode de rappel. Vous ne l'avez pas encore vu car votre écouteur n'a jamais eu à invoquer le rappel. Donc, vous allez devoir fixer ce code comme ceci:

private function topNavigationClickHandler(e:Event):void 
{ 
    trace('Back to root'); 
} 

Aussi je veux juste ajouter que votre si la condition sur la définition de cet écouteur semble un peu redondant, puisque vous savez déjà que vous attendez le swf de navigation, parce que vous le chargez explicitement. Aussi je ne crois pas que la propriété de nom serait définie comme ceci. Généralement, le nom n'est défini que dans l'EDI avant la compilation, et s'il ne l'est pas, il est généré dynamiquement au moment de l'exécution. Ce qui pourrait être plus utile est de vérifier l'URL du fichier SWF chargé pour voir s'il contient "topNavigation" ou quel que soit le nom swf. Vous pouvez le faire comme ceci:

var swfUrl:String = myLoader.contentLoaderInfo.url; 
if (swfUrl.search("topNavigation") != -1){ 
    //Match found, add listener for navigation 
} 
+0

Merci pour votre réponse. Je viens d'ajouter une trace à votre premier code, mais ça marche bien. Il est tracé "ajout d'écouteur" mais le "clickHandle" n'est toujours pas activé. J'ai aussi essayé d'ajouter un événement pour une mouse.CLICK appelant la fonction: \t \t 'private function testClick (event: MouseEvent) \t \t { \t \t \t trace (clic enregistré»); \t \t \t event.currentTarget.init (null); \t \t \t événement.currentTarget.addEventListener ("clickHandle", topNavigationClickHandler); \t \t} ' mais cela fonctionne pour les 2 premières lignes, trace et init fonction de mon swf chargé mais pas pour le « clickHandle » à nouveau ... – 1stIssue

+0

Dans le code ci-dessus vous avez collé, vous appelez la Méthode init avant d'avoir ajouté l'écouteur à l'objet. Cela ferait dépendre l'événement avant que vous soyez prêt à le recevoir. Aussi, ajoutez-vous ce swf chargé à la scène n'importe où? Si ce n'est pas le cas, et que vous voulez simplement le tester comme vous l'avez montré ci-dessous, essayez de désactiver la bulle d'événement, au cas où cela risquerait d'endommager votre auditeur direct en essayant de passer la liste d'affichage. Si l'objet n'est pas ajouté, il n'a pas de parent et est donc déconnecté de la liste d'affichage et le bouillonnement échouera. –

+0

Oh mec, résolu l'erreur. En demandant à un autre gars, il m'a dit d'essayer ceci: stage.dispatchEvent (new Event ("clickHandle", true)); dans mon SWF chargé.Maintenant, j'ai essayé votre manquant (événement: Événement) et supprimé la scène de sorte qu'il dit: dispatchEvent (nouvel événement ("clickHandle", vrai)); et maintenant il semble fonctionner :) Donc, autant que je peux l'imaginer, il a provoqué l'erreur à cause de l'événement manquant: Événement! :) Merci beaucoup ! :) – 1stIssue

Questions connexes