as3 calling a function in Main.as Document Class f

2019-02-27 16:46发布

问题:

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 tried several methods and they do not seem to work. Here is one example I tried.

anotherClass.as // This needs to access functions Main.as

package com 
{
import Main;

public class anotherClass
    {
private var stageMain:Main;

public function anotherClass() 
        {
    // tries to call a function in Main.as called languageLoaded. NO WORK!  
        stageMain.languageLoaded("English");
    // in the Main.as languageLoaded is a public function

        }

    }
}

回答1:

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!");
    }
}


回答2:

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



回答3:

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);



        }

    }



    }

}