1

グローバルにする代わりに、各オブジェクトでステージの非静的参照を作成すると、どのような利点があるのだろうか。そのため、null の逆参照に問題があるだけです。しかし、アドビのクルーがなぜそのようにしたのかには理由があるに違いありません。それで、誰かが私にその行動を説明できますか?また、次のコードのようなものを使用し、ステージが必要なすべての場所で 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 を拡張しているのはなぜですか?

4

2 に答える 2

5

各 Flash ムービーには通常、表示オブジェクトが描画されるステージが 1 つありますが、AIR アプリケーションには「グローバル」ステージが 1 つだけではありません。各ウィンドウには独自のステージがあるため、各ウィンドウ オブジェクトには独自のステージへの独自のインスタンス参照が必要です。その場合、単一の静的グローバル ステージ オブジェクトを作成するのは適切ではありません。AIR アプリケーションが複数のウィンドウを必要とする場合はどうでしょうか。

于 2011-06-23T14:24:58.293 に答える
0

上で誰かが尋ねた、「なぜステージはグローバルでなければならないのですか?」A : グローバルであるべきではないと思いますが、ステージへのグローバル アクセスが非常に役立つ単純なユース ケースを次に示します。DisplayObject および/またはそのビジュアル アセットをその前にレイアウト (位置、サイズ) するために使用可能なピクセルを見つけるが表示リストに追加されます

拡張しないレイアウト クラスがあり、表示リストに追加されるDisplayObjectDisplayObjects への参照をレイアウトに取得することがあります。そのため、独自のプロパティはまだありません。以下の方法を使用すると、メイン ドキュメント クラスがプロパティを持ち、呼び出し た後はいつでも、現在使用可能なピクセルを常に知ることができます。DisplayObjectstagestageGlobalReference.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. */
}
于 2012-12-19T02:05:08.083 に答える