as3声明一个GLOBAL变量 - 在TIMELINE / CLASS之外

时间:2012-05-01 02:06:37

标签: actionscript-3 flash scope global-variables global

我希望在主时间线中声明一个GLOBAL VAR。

然后我需要从另一个外部加载的SWF访问该GLOBAL VAR。

问题:

如何在主时间轴中创建全局变量?

如何在外部加载的swf文件中访问该变量?

2 个答案:

答案 0 :(得分:2)

首先,您不应使用任何 global/static state。在你的情况下,这甚至更多是真的,因为单身人士在不同应用程序域中的屁股上是一种巨大的痛苦。

相反,您应该使用名为Dependency Injection的内容。想想你的小swfs是饥饿的孤儿。当他们装载时,他们不会跑到你的主要瑞士法郎并捡起它的口袋。相反,主要的瑞士法郎大幅度地将钱投入他们的小手中。

那么,我们如何实现这一目标呢?一种方法是我们可以将对其Document类的引用编译到主swf中,然后我们可以设置Class公开的变量。但是,这可能会非常沉重,并不是必需的。

相反,你可以写一个名为Interface的东西,它定义了一个孤儿的“想法”。

它可能看起来像这样:

public interface IOrphan {
   function get alms():Number;
   function set alms(value:Number):void;
}

请注意,您必须使用带接口的getter和setter,因为您无法使用它们来定义vanilla变量。然而,这对我们的实际孤儿来说非常有用:

public class Oliver implements IOrphan {
    private var _alms:Number;
    private var _totalAlms:Number;
    public var tf:TextField;//put this on stage and allow Flash to populate automatically
    public function get alms():Number {
       return _alms;
    }
    public function set alms (value:Number):void {
      _alms = value;
      _totalAlms += _alms;
      updateAlmsMessage();
    }
    private function updateAlmsMessage():void {
       tf.text = 'That was a donation of ' + _alms + '.\n'
                 'I now have ' _totalAlms + '.\n'
                 'Please, sir, can I have some more?';
    }
}

现在,您需要做的就是在加载时填充该变量。有几种方法可以实现这一点,例如watching the stage可以加载IOlivers,或者你可以更直接地了解它:

private function loadSwf(url:String):void {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            var request:URLRequest = new URLRequest(url);
            loader.load(request);
            addChild(loader);
}

private function completeHandler(e:Event):void {
   ((e.target as LoaderInfo).content as IOrphan).alms = .25;
}

答案 1 :(得分:1)

如果这些变量只需要设置一次并且永远不会改变,那么你可以创建一个包含静态常量的类。

package
{
    public class Env
    {
        public static const WHATEVER:String = "Whatever!";

        public function Env()
        {}
    }
}

然后您可以在程序中稍后访问它们,如下所示:

trace(Env.WHATEVER);

但是,如果你想要可以改变的全局变量,我喜欢通过使用单例类来处理它。

package 
{
import flash.events.EventDispatcher;

public class Control extends EventDispatcher
{
    //---------------------------------------
    // PRIVATE & PROTECTED INSTANCE VARIABLES
    //---------------------------------------

    private static var _instance:Control;

    //---------------------------------------
    // PUBLIC VARIABLES
    //---------------------------------------

    public var whatever:String = "Whatever";

    //---------------------------------------
    // PUBLIC METHODS
    //---------------------------------------

    public static function get instance():Control
    {   
        return initialize();
    }

    public static function initialize():Control
    {
        if (_instance == null)
        {
            _instance = new Control();
        }
        return _instance;
    }

    //---------------------------------------
    // CONSTRUCTOR
    //---------------------------------------

    public function Control()
    {
        super();
        if (_instance != null)
        {
            throw new Error("Error:Control already initialised.");
        }
        if (_instance == null)
        {
            _instance = this;
        }
    }

}
}

这里的不同之处在于你需要抓住你的单身实例然后才能找到它里面的东西。它看起来有点像这样。

private var _control:Control = Control.instance;
// Reading a global variable
trace(_control.whatever);
// Change a global variable
_control.whatever = "Foobar!";

因此,无论何时更改“无论什么”,该变量都将针对所有加载的SWF进行更改。如果你真的想要它,你可以在你的单身中使用getter / setter而不是简单的公共变量。