2013-11-22 2 views
0

У меня есть класс, вызывающий функцию в другом классе. Я хочу знать , если мы можем добавить прослушиватель событий, чтобы узнать, была ли эта функция запущена и закончена.as3 addEventListner для функции в другом классе

Вот раздел соответствующего кода.

myMC = new pictures(); 
addChild(myMC); 
myMC.loadImages("Joyful",1) 
// Add Event Listener here to let me know loadImages was called and worked. 

Как вы можете видеть, что функция называется loadImages(), и он находится в классе под названием pictures.as

Могу ли я добавить слушатель события к этому?

Это новая проблема. Я использую подобный метод, и я использовал ваш пример ниже, и он не работал. Я пропускаю импорт или что-то еще? Я только показываю функции, которые относятся, а не весь мой сценарий.

Main.class пакет {

import flash.display.MovieClip; 
import flash.events.*; 
import flash.display.*; 
import flash.filesystem.*; 
import com.greensock.*; 
import com.greensock.easing.*; 
import flash.system.System; 

// Ed's Scripts 
import com.*; 
import com.views.*; 


public class iRosaryMain extends MovieClip 
{ 

    /// (Get Main Doc flow) this creates an instace of the main timeline 
    /// and then I send it 
    private static var _instance:iRosaryMain; 
    public static function get instance():iRosaryMain 
    { 
     return _instance; 
    } 

    /// Declaring Vars 
    var audio:audioPrayers; 

    /// Loading Images 
    //public var theImages:pictures = new pictures(); 

    /// Movie Clips 
    public var myMary:beautifulMary; 
    public var myMC:MovieClip; 
    public var myPic:MovieClip; 
    public var myFlags:MovieClip; 
    public static var mt:MovieClip; 



    var vars:defaultVars = new defaultVars(); 



    public function iRosaryMain() 
    { 
     // (Get Main Doc flow) Here I send the an instacne of iRosaryMain to defaultVars.as 
     _instance = this; 
     vars.getMainDoc(_instance); 

     // Sets timeline to mt :) I hope 
     mt = _instance; 

     audio = new audioPrayers(); 
     trace("Jesus I trust in you!");// constructor code 
     audio.sayHailMary(); 
     if (stage) 
     { 
      init(); 


     } 
    } 


    public function moveLanguages() 
    { 

     /// File to languages folder 
     var checkLanguageFolder:File = File.applicationStorageDirectory.resolvePath("Languages"); 

     ///// CHECK LANGUAGES FOLDER - if not in App Storage move it 
     if (! checkLanguageFolder.exists) 
     { 
      var sourceDir:File = File.applicationDirectory.resolvePath("Languages"); 
      var resultDir:File = File.applicationStorageDirectory.resolvePath("Languages"); 
      sourceDir.copyTo(resultDir, true); 
      trace("Moved Language!"); 
     } 
    } 


    //// MAIN FUNCTIONS IN iRosaryMainClass 
    function init() 
    { 



     //loadFlags(); 
     moveLanguages(); 
     //addChild(theImages); 
     intro(); 

    } 


    public function loadFlags() 
    { 
     myFlags.addEventListener("MyEvent", eventHandler); 
     myFlags = new viewLanguages(); 

     addChild(myFlags); 
     myFlags.x = stage.stageWidth/2 - myFlags.getBounds(this).width/2; 

     function eventHandler() 
     { 
      trace("yes loaded"); 
      TweenMax.fromTo(myMary,3, {alpha:1}, {alpha:0, ease:Quint.easeOut, onComplete: closePic}); 
     } 
    } 

    function intro() 
    { 

     myMary = new beautifulMary(); 
     addChild(myMary); 
     loadFlags(); 
    } 



    public function closePic() 
    { 
     removeChild(myMary); 
    } 



    public function languageLoaded(lang:String) 
    { 
     trace("YES... " + lang); 
     homeIn(); 
    } 


    public function homeIn() 
    { 
     if (myFlags) 
     { 
      TweenMax.fromTo(myFlags,1, {x:myFlags.x}, {x:0-myFlags.width, ease:Quint.easeInOut, onComplete:unloadMyFlags}); 
     } 

     function unloadMyFlags() 
     { 
      trace("Called Ease out"); 
      if (myFlags is MovieClip) 
      { 
       //trace("CURRENT DISPLAY " + currentDisplayScreen); 
       trace("CURRENT mc " + myFlags); 
       removeChild(myFlags); 
       System.gc(); 
       myFlags = null; 
       trace("CURRENT mc " + myFlags); 

      } 

     } 

     if (! myMC) 
     { 
      myMC = new viewHome(); 
      myMC.name = "Home"; 
      myMC.x = stage.stageWidth/2 - myMC.width/2; 
      addChild(myMC); 
     } 

     theEaseIn(myMC); 
     //Home.B1.addEventListener(MouseEvent.CLICK, theEaseOut(Home)); 
    } 


    public function loadLanguage(Language:String):Function 
    { 
     return function(e:MouseEvent):void ; 
     { 
      trace("Did it work? " +Language); 
      vars.loadButtonVars(Language);; 
     }; 

     //TweenMax.fromTo(EnglishButton,1, {x:EnglishButton.x}, {x:0-EnglishButton.width, ease:Quint.easeOut}); 
    } 


    public function loadView(screen:String) 
    { 

     trace("Received " + screen); 
     if (screen=="Home") 
     { 
      myMC = new viewHome(); 
      addChild(myMC); 
      theEaseIn(myMC); 
      //Home.B1.addEventListener(MouseEvent.CLICK, theEaseOut(Home)); 
     } 
     if (screen=="PrayTheRosary") 
     { 
      myMC = new viewPrayTheRosary(); 
      addChild(myMC); 
      theEaseIn(myMC); 
      //Home.B1.addEventListener(MouseEvent.CLICK, theEaseOut(Home)); 
     } 
     if (screen=="Options") 
     { 
      myMC = new viewOptions(); 
      addChild(myMC); 
      theEaseIn(myMC); 
     } 
     if (screen=="Downloads") 
     { 
      myMC = new viewDownloads(); 
      addChild(myMC); 
      theEaseIn(myMC); 
     } 
     if (screen=="beautifulMary") 
     { 
      myMC = new beautifulMary(); 
      addChild(myMC); 
      theEaseIn(myMC); 
     } 
     if (screen=="Flags") 
     { 
      myFlags = new viewLanguages(); 
      addChild(myFlags); 
      theEaseIn(myFlags); 
     } 
     if (screen=="Joyful" || screen=="Sorrowful" || screen=="Glorious" || screen=="Luminous") 
     { 
      myPic = new pictures(); 
      addChild(myPic); 
      myPic.addEventListener("ImagesLoaded", doTheEaseIn); 
      myPic.loadImages(""+screen+"",1); 
      function doTheEaseIn() 
      { 
       theEaseIn(myPic); 
      } 
     } 

    } 



    public function theEaseIn(mc:MovieClip) 
    { 
     if (myMC) 
     { 
      TweenMax.fromTo(mc,1, {x:stage.stageWidth+mc.width}, {x:stage.stageWidth/2 - mc.width/2, ease:Quint.easeInOut}); 


     } 
    } 

    public function theEaseOut(mc:MovieClip,nextMC:String):Function 
    { 
     return function(e:MouseEvent):void ; 
     { 
      loadView(nextMC); 
      /// Tweens out view on screen 
      TweenMax.fromTo(mc,1, {x:mc.x}, {x:0-mc.width, ease:Quint.easeInOut, onComplete:unloadMC}); 
      function unloadMC(); 
      { 
       trace("Called Ease out"); 
       if(mc is MovieClip); 
       { 
        //trace("CURRENT DISPLAY " + currentDisplayScreen); 
        trace("CURRENT mc " + mc); 
        removeChild(mc); 
        System.gc(); 
        myMC = null; 
        trace("CURRENT mc " + mc); 

       }; 

      }; 
     };/// end return 
    } 




    //////////// 
}/// End iRosaryMain 

} // Конец пакета

viewLanguages.as

пакет com.views

package com.views 
{ 

    import flash.display.MovieClip; 
    import flash.filesystem.File; 
    import com.roundFlag; 
    import flash.events.*; 
    import flash.display.*; 


    public class viewLanguages extends MovieClip 
    { 

     var Flag:MovieClip; 
     //public static const FLAGS_LOADED:String = "flagsLoaded"; 
     public function viewLanguages() 
     { 
      getLang(); 
     } 


     function numCheck(num:int):Boolean 
     { 
      return (num % 2 != 0); 
     } 
     /// Get for App Opening 
     public function getLang() 
     { 
      /// When Live 
      var folderLanguages:File = File.applicationStorageDirectory.resolvePath("Languages"); 
      var availLang = folderLanguages.getDirectoryListing(); 
      var Lang = new Array(); 
      var LangPath = new Array(); 
      var fl:int = 0; 
      for (var i:uint = 0; i < availLang.length; i++) 
      { 

       if (availLang[i].isDirectory) 
       { 
        //flag = new Loader(); 
        //flag.load(new URLRequest(File.applicationStorageDirectory.url + "Languages/" + Lang[i] + "/roundFlag.png")); 


        Lang.push(availLang[i].name); 
        LangPath.push(availLang[i].nativePath); 
        Flag = new roundFlag(availLang[i].name); 
        Flag.name = availLang[i].name; 

        if (numCheck(i)==false) 
        { 
         Flag.y = fl; 
         Flag.x = 0; 

        } 
        else 
        { 
         Flag.y = fl; 
         Flag.x = Flag.width + 33; 
         fl = fl + Flag.height + 33; 
        } 

        Flag.btext.text = availLang[i].name; 
        addChild(Flag); 


        trace(availLang[i].nativePath);// gets the name 
        trace(availLang[i].name); 

       } 
      } 
      trace("Get Lang Called"); 
      dispatchEvent(new Event("MyEvent")); 
     } 



    } 

} 

ответ

1

Да, вы можете. Учитывая, что вы добавляете свой клип в список отображения, я предполагаю, что он расширяет либо Movieclip или Sprite, оба из которых расширяют EventDispatcher. В вашем классе изображений вы можете просто использовать dispatchEvent(new Event("MyEvent"); для отправки события. Затем вы можете добавить myMC.addEventListener("MyEvent", eventHandler);, чтобы отреагировать на него.

Вы также не должны использовать строки для таких событий, как я написал выше. Было бы лучше, если бы вы объявили public static const IMAGES_LOADED:String = "imagesLoaded"; в вашем классе изображений. Затем вы должны использовать эту константу, отправив ее и прослушав ее.

EDIT: Вот как это будет выглядеть с константой:

//your class 
package { 

    import flash.events.Event; 
    import flash.display.Sprite; 

    public class Pictures extends Sprite { 

     public static const IMAGES_LOADED:String = "imagesLoaded"; 

     public function Pictures() { 

     } 

     public function onAllImagesLoaded():void { 
      dispatchEvent(new Event(IMAGES_LOADED)); 
     } 
     //rest of your methods 
    } 
} 

//you would call it like this: 
var myMc:Pictures = new Pictures(); 
myMc.addEventListener(Pictures.IMAGES_LOADED, onImagesLoaded); 
myMc.loadImages(); 

function onImagesLoaded(e:Event):void { 
    //...etc 
} 
+0

Можете ли вы дать пример второго варианта, который вы предложили? с статическим const и т. д. ?? –

+1

См. Отредактированный пост. – Fygo

+0

Удивительно, я получил его, чтобы работать в одном примере, но в том, что выше его не вызывает. Любые идеи относительно того, почему нет? Спасибо –

1

Вы должны создать пользовательский класс событий для этой работы. Как:

package com.some 
{ 

    import flash.events.Event; 

    public class SomeEvent extends Event 
    { 

     // Loading events 
     public static const MAINDATA_LOADING:String = "onMainDataLoading"; 
     // Other event 
     public static const SOME_LOADING:String = "onSomeLoading";  


     public var params:Object; 

     public function SomeEvent($type:String, $params:Object, $bubbles:Boolean = false, $cancelable:Boolean = false) 
     { 
      super($type, $bubbles, $cancelable); 
      this.params = $params; 
     } 

     public override function clone():Event 
     { 
      return new SomeEvent(type, this.params, bubbles, cancelable); 
     } 

    } 

} 

Добавить отправку событий внутри разыскиваемый класса (картинки) и передать хотел Params в случае (это или какие-то еще)

dispatchEvent(new SomeEvent(SomeEvent.IMAGES_LOADED, this)); 

Handle событие прослушивания:

var myMc:Pictures = new Pictures(); 
myMc.addEventListener(SomeEvent.IMAGES_LOADED, onImagesLoaded); 
myMc.loadImages(); 

function onImagesLoaded(e:SomeEvent):void { 
    // handle event. 
    var picts:Pictures = (e.params as Pictures); 
} 
+0

Любые идеи по этому XML-вопросу. его разоблачает меня! http://stackoverflow.com/questions/20201099/as3-urlrequest-and-file-stream-saving-xml-data-error-3013-file-or-directory –

Смежные вопросы