as3 calling a function in Main.as Document Class from another class

前端 未结 3 1510
天涯浪人
天涯浪人 2021-01-27 01:17

I am sure this is a popular question but I can\'t find the exact answer I need. I simply need to access a function or functions created in the Main.as document class. I have tri

相关标签:
3条回答
  • 2021-01-27 01:20

    Ok I got the following code to work. It's really a messy solution but I didn't know of a better way. It works. I just hope it's stable and does not use a lot of resources.

    If you have a much better Idea I am open.

    Here is the MainDoc.as

    package  {
    
    import flash.display.MovieClip;
    import flash.events.*;
    import com.*;
    import com.views.*;
    import flash.display.*;
    import flash.filesystem.*;
    import com.greensock.*;
    import com.greensock.easing.*;
    import flash.system.System;
    
    
    
    public class mainDoc extends MovieClip 
        {
    
        /// (Get Main Doc flow) this creates an instace of the main timeline
        /// and then I send it 
        private static var _instance:mainDoc;
        public static function get instance():mainDoc { return _instance; }
    
    
    
        /// Calls the defaultVars.as in to "vars".
        var vars:defaultVars = new defaultVars();
    
    
    
            public function mainDoc() 
            {
                /// Makes this class ready to be passed to defautVars.as
                _instance = this;
                        // Sends the _instance to defaulVars.as to be accessed later.
                vars.getMainDoc(_instance);
    
                // Calls a function in defaultVars.as and loads a var
                vars.loadButtonVars("English"); 
            }
    
        }
    }
    

    Here is the defaultVars.as

    package com {
    import flash.display.Stage;
    import flash.events.*
    import flash.net.*;
    import flash.display.*;
    import flash.filesystem.*;
    
    
    
        public class defaultVars
        {
    
    
            /// Makes the MainDoc.as a MovieClip
            // Not sure if this is good but it works. 
            public var MainDoc:MovieClip;
    
    
            public function defaultVars() 
            {
    
            }
    
            public function getMainDoc(_instance:MovieClip) 
            {
            trace("CALLED" + _instance);
                /// receives the _instance var and its converted to a MovieClip
                // This can now be used in any function because I declared it a public var. 
            MainDoc = _instance;
            }
    
    
    
    
    
    
    public function loadButtonVars(Language:String)
        {
    
    
        myLoader.load(new URLRequest("Languages/" + Language + "/vars.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    
         function processXML(e:Event):void 
            {
            myXML = new XML(e.target.data);
    
            /// Home Screen Buttons
            homeT = myXML.Button.(@Title=="homeT");
            homeB1 = myXML.Button.(@Title=="homeB1");
            homeB2 = myXML.Button.(@Title=="homeB2");
            homeB3 = myXML.Button.(@Title=="homeB3");
            homeB4 = myXML.Button.(@Title=="homeB4");
            homeB5 = myXML.Button.(@Title=="homeB5");
    
    
        /// HERE IS WHERE I CALL FUNCTION from MainDoc after xml is loaded. 
        /////////////////
        trace("xml loaded!!!! " + homeB1);
        MainDoc.languageLoaded(Language);
    
    
    
            }
    
        }
    
    
    
        }
    
    }
    
    0 讨论(0)
  • 2021-01-27 01:25

    The cleaner way is to simply pass a reference to Main to the constructor of the class you want to be able to access it.

    For example, your AnotherClass could look like this:

    class AnotherClass
    {
        private var _main:Main;
    
        public function AnotherClass(main:Main)
        {
            _main = main;
            _main.test(); // Success!
        }
    }
    

    And your main class:

    class Main
    {
        public function Main()
        {
            var another:AnotherClass = new AnotherClass(this);
        }
    
        public function test():void
        {
            trace("Success!");
        }
    }
    
    0 讨论(0)
  • 2021-01-27 01:35
    public class MainDoc extends MovieClip // as long as it extends eventDispatcher you re fine
    {
      private var otherClass:OtherClass;
      public function MainDoc()
      {
        otherClass = new OtherClass();
        otherClass.addEventListener("otherClassCustomEvent", onOtherClassReady);
        otherClass.startLogic();
      }
      public function onOtherClassReady(event:Event = null)
      {
        trace("from other class:", otherClass.infoToShare) // traces "from other class: YOLO!"
      }
    }
    
    public class OtherClass extends EventDispatcher // must extend the event dispatcher at least
    {
      public var infoToShare:String;
      public function OtherClass()
      {
      }
      public function startLogic()
      {
        // do what you got to do
        // when you have your data ready
        infoToShare = "YOLO!";
        dispatchEvent("otherClassCustomEvent");
      }
    }
    

    Once you're confortable with that, you can start looking into building custom events that could carry the variable to send back

    0 讨论(0)
提交回复
热议问题