as3从另一个类调用Main.as Document Class中的函数

时间:2013-11-18 16:58:41

标签: actionscript-3 function class scope

我确信这是一个很受欢迎的问题,但我找不到我需要的确切答案。我只需要访问Main.as文档类中创建的一个或多个函数。我尝试了几种方法,它们似乎不起作用。这是我试过的一个例子。

anotherClass.as //这需要访问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

        }

    }
}

3 个答案:

答案 0 :(得分:3)

更简洁的方法是简单地将对Main的引用传递给您希望能够访问它的类的构造函数。

例如,您的AnotherClass可能如下所示:

class AnotherClass
{
    private var _main:Main;

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

你的主要班级:

class Main
{
    public function Main()
    {
        var another:AnotherClass = new AnotherClass(this);
    }

    public function test():void
    {
        trace("Success!");
    }
}

答案 1 :(得分:1)

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

一旦您对此感到满意,您就可以开始构建可以带回变量的自定义事件

答案 2 :(得分:-1)

好的,我有以下代码可以使用。这真的是一个混乱的解决方案,但我不知道更好的方法。有用。我只是希望它稳定并且不会使用大量资源。

如果你有更好的想法我就是开放的。

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

    }
}

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



        }

    }



    }

}