我希望在主要时间线中声明一个 GLOBAL VAR。
然后我需要从另一个外部加载的 SWF 访问该 GLOBAL VAR。
问题:
如何在主时间轴中创建全局变量?
如何在外部加载的 swf 文件中访问该 var?
我希望在主要时间线中声明一个 GLOBAL VAR。
然后我需要从另一个外部加载的 SWF 访问该 GLOBAL VAR。
问题:
如何在主时间轴中创建全局变量?
如何在外部加载的 swf 文件中访问该 var?
首先,您不应该使用任何 全局/静态状态。在您的情况下,情况更是如此,因为单例是跨不同应用程序域的皇家痛苦。
相反,您应该使用称为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;
}
如果这些是您只想设置一次并且永远不会更改的变量,您可以创建一个包含静态常量的类。
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 而不是简单的公共变量。