动作脚本 3 - 为什么舞台不是全局的?



我想知道在每个对象中进行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?

尽管每个Flash电影通常都有一个单独的舞台,在这个舞台上绘制可见的显示对象,但在AIR应用程序中,并不是只有一个"全局"舞台;每个窗口都有自己的阶段,因此每个窗口对象都必须有自己的实例引用来引用自己的阶段。在这种情况下,创建一个静态全局stage对象是不对的——如果AIR应用程序需要多个窗口呢?

上面有人问:"为什么舞台应该是全球性的?"答:我不认为应该是全局的,但这里有一个简单的用例,全局访问Stage非常有用:在DisplayObject添加到显示列表之前,查找可用像素以布局(位置、大小)DisplayObject和/或其视觉资产

我有时有一些布局类不扩展DisplayObject,并在DisplayObject添加到显示列表之前获得对DisplayObjects的引用来布局,因此还没有自己的stage属性。使用下面的方法,在主文档类具有stage属性并调用GlobalReference.global.stage = stage;

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

警告!!全球是危险的,并且容易滥用

我添加了对"全局"对象的引用(非常仔细和周到),这样我就可以从任何类访问它们,尤其是能够在闭包或匿名函数中访问它。闭包不需要调用静态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. */
}

相关内容

  • 没有找到相关文章

最新更新