为什么不是全球舞台?

时间:2011-06-23 14:20:22

标签: actionscript-3 global-variables stage

我想知道在每个对象中制作舞台非静态引用的好处是什么,而不是使它全局化。因此,我只有解除引用null的问题。但是,必须有Adobe工作人员这样做的原因。那么,有人可以解释一下这种行为吗?当我使用类似下面代码的东西时,我可以遇到什么问题,并在需要阶段的地方使用gStage?

package
{
    public var gStage: Stage;
    public class Main extends Sprite;
    {
        public function Main()
        {
            if (stage)
                init();
            else
                stage.addEventListener (Event.ADDED_TO_STAGE, init);
        }
        public static function init(): void
        {
            stage.removeEventListener (Event.ADDED_TO_STAGE, init);
            gStage = stage;
        }
    }
}

顺便说一下,为什么在每个AS3代码示例中我都见过Main扩展Sprite?

2 个答案:

答案 0 :(得分:5)

尽管每个Flash影片通常都有一个可绘制可见显示对象的阶段,但AIR应用程序中不仅有一个“全局”阶段;每个窗口都有自己的阶段,因此每个窗口对象必须有自己的实例引用到它自己的阶段。在这种情况下,创建一个静态全局阶段对象是不对的 - 如果AIR应用程序需要多个窗口该怎么办?

答案 1 :(得分:0)

有人问道,“为什么舞台应该是全球性的?” 答:我不认为应该是全局的,但这是一个简单的用例,其中对舞台的全局访问非常有用: 在将DisplayObject和/或其可视资产添加到显示列表之前,找到布局(位置,大小)布局(位置,大小)的可用像素。

我有时会使布局类不扩展DisplayObject并在 DisplayObject添加到显示列表之前将DisplayObjects引用到布局 - 因此它还没有 stage 属性。 使用下面的方法,我可以随时知道主文档类具有 stage 属性并调用后的当前可用像素 GlobalReference.global.stage = stage;

var screenWidth : uint = GlobalReference.global.stage.stageWidth;
var screenHeight : uint = GlobalReference.global.stage.stageHeight;

!!警告 !!全局变量是危险的,容易被滥用

我添加对'global'对象的引用(非常仔细和仔细),以便我可以从任何类访问它们 - 特别是能够在闭包或匿名函数中访问它。闭包不需要调用静态getter,因为它们已经在全局范围内。

package com.appcloud9.utils
{
    public class GlobalReference
    {
        public static function get global() : Object
        {
            // may be superstition, but I *think* that assigning the function
            // to a var is better for garbage collection later
            var getGlobal : Function = function() : Object
            {
                return this;
            };
            return getGlobal();
        }
    }
}

// usage examples :

// I call this in my main document class on the Event.EXIT_FRAME event :
GlobalReference.global.stage = stage;

// later in a closure
var signalLightsOut = new Signal();
signalLightsOut.add( function() : void
{
    trace( stage );                        // [object Stage]
} );

// later in a constructor - before the class has a stage of it's own
public function MyConstructor()
{
    trace( stage );                        // null
    trace( GlobalReference.global.stage ); // [object Stage]
    /* note : it is usually best and fully adequate to wait until a class extending
        DisplayObject has its own stage : after Event.ADDED_TO_STAGE and then
        Event.EXIT_FRAME it is guaranteed. */
}