0

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

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

问题:

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

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

4

2 回答 2

2

首先,您不应该使用任何 全局/静态状态。在您的情况下,情况更是如此因为单例是跨不同应用程序域的皇家痛苦。

相反,您应该使用称为Dependency Injection的东西。把你的小瑞士法郎想象成饥饿的孤儿。当它们加载后,它们不会跑到您的主要 swf 并捡起它的口袋。相反,主要的瑞士法郎慷慨地将钱压在他们的小手中。

那么,我们如何做到这一点呢?一种方法是我们可以将对它们的 Document 类的引用编译到主 swf 中,然后我们可以设置一个 Class 公开的变量。但是,这可能会变得非常繁重,并且并不是真正必要的。

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

它可能看起来像这样:

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

请注意,您必须将 getter 和 setter 与接口一起使用,因为您不能使用它们来定义 vanilla 变量。但是,这对我们实际的 Orphan 来说非常有用:

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?';
    }
}

现在,您需要做的就是在加载时填充该变量。有几种方法可以做到这一点,例如观看要加载的 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;
}
于 2012-05-01T12:44:31.980 回答
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 而不是简单的公共变量。

于 2012-05-01T02:56:40.690 回答