上で誰かが尋ねた、「なぜステージはグローバルでなければならないのですか?」A : グローバルであるべきではないと思いますが、ステージへのグローバル アクセスが非常に役立つ単純なユース ケースを次に示します。DisplayObject および/またはそのビジュアル アセットをその前にレイアウト (位置、サイズ) するために使用可能なピクセルを見つけるが表示リストに追加されます。
拡張しないレイアウト クラスがあり、表示リストに追加される前にDisplayObject
DisplayObjects への参照をレイアウトに取得することがあります。そのため、独自のプロパティはまだありません。以下の方法を使用すると、メイン ドキュメント クラスがプロパティを持ち、呼び出し
た後はいつでも、現在使用可能なピクセルを常に知ることができます。DisplayObject
stage
stage
GlobalReference.global.stage = stage;
var screenWidth : uint = GlobalReference.global.stage.stageWidth;
var screenHeight : uint = GlobalReference.global.stage.stageHeight;
!! 警告 !!グローバルは危険で誤用されやすい
「グローバル」オブジェクトへの参照を(非常に慎重かつ思慮深く)追加して、どのクラスからでもアクセスできるようにします。特に、クロージャーまたは無名関数でアクセスできるようにします。クロージャーは既にグローバル スコープにあるため、静的ゲッターを呼び出す必要はありません。
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. */
}