0

注: はい、以前にも同様の質問があったことは承知しています。しかし、そのような質問の答えに従った後でも、私はまだ立ち往生しており、問題の解決策を見つけることができません.

Flash ステージに DisplayObject を追加する必要があるという問題があります。いくつかの異なるクラスの要素を表示する必要があるため、addChild以下に示すように、.as ファイルと「Displayer」という関数の間の仲介として機能するクラスを作成することにしました。

package
{
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.display.Stage;

    public class Displayer extends Sprite //I read somewhere that DisplayObject
//as an extension can't be used for this, so Sprite will have to do.
    {
        private var _stage:Stage;

        function Displayer()
        {
            _stage = new Stage;
        }

        public function displayElement(displayable:DisplayObject)
        {
            _stage.addChild(displayable);
        }
    }
}

コンパイルすると、理解できない問題が発生します: エラー #2012: Stage クラスをインスタンス化できません。明らかに、このコードには何かが欠けているか、場違いです。それほど複雑ではないと思いますが、部外者の視点が必要なだけかもしれません。

4

4 に答える 4

4

Stage オブジェクトはグローバルにアクセスできません。DisplayObject インスタンスの stage プロパティを介してアクセスする必要があります。

以下のドキュメントを参照してください。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Stage.html

package
{
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.display.Stage;

    public class Displayer extends Sprite
    {
        var isAddedToStage:Boolean;

        public function Displayer()
        {
            if(stage) init();
            else      addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event=null):void
        {
           removeEventListener(Event.ADDED_TO_STAGE, init);
           isAddedToStage = true;
        }

        public function displayElement(displayable:DisplayObject):void
        {
            if(isAddedToStage)
              this.stage.addChild(displayable);
        }
    }
}
于 2013-02-05T14:46:18.333 に答える
1

Stageエラーが示すように、クラスをインスタンス化しません。クラスをインスタンス化できないのと同じようにDisplayObject(これが を拡張する必要がある理由ですSprite)。

基本的に、ここには 2 つのオプションがあります。

1) インスタンスから子を追加しDisplayObjectContainerます。

var displayerInstance:Displayer = new Displayer();
this.addChild( displayerInstance );

これは、グローバル ステージに既に追加されている DisplayObjectContainer オブジェクトから実行します。どのプロジェクトにもステージは 1 つしかありません。SWF を埋め込む場合でも、SWF のステージ プロパティは実際には最上位アプリケーションのステージ プロパティです。Displayerそのため、メイン アプリケーションで作成された別のクラス内にネストされたクラス内にこのインスタンスがネストされている場合、それらのクラスのそれぞれで「addChild」を実行して、Displayer表示する必要があります。

2) ごまかす。これはまったくお勧めできませDisplayer基本的に、クラスをインスタンス化するときに、オブジェクトのステージ オブジェクトを渡します。

var displayerInstance:Displayer = new Displayer( this.stage );
public function Displayer( stage:Stage ) {
    this.stage = stage;

    if ( this.stage ) {
        this.stage.addChild( this );
    }
}

これは、シングルトンをステージに追加するのに適した方法です (ただし、シングルトンのコンストラクターはありません)。私はクリスマスの直前にプロファイラーを作成しました。これは、必要に応じてステージに物を追加するためにこのメソッドを使用するシングルトン (後でスカウトを見つけました) でした。

この場合も、2 番目のオプションは推奨されませんが、可能性はあります。

余談ですが、明確な理由 (ポップアップなど) がない限り、に何かを直接追加しないでください。StageDisplayObjectContainer が別の DisplayObject または DisplayObject コンテナを子として追加するなど、表示リストの方法論に従う必要があります。これにより、それらはすべて TopLevelApplication に接続されます。

于 2013-02-05T16:20:23.073 に答える
0

常に簡単な解決策があります。クラスからステージに子要素を追加する必要がある場合は、ステージをオブジェクトとしてクラスに渡し、子要素を追加するだけです。こんなステージ。

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.display.Bitmap;

    public class ImageLoader extends Sprite{


        private var stageObj:Object; //create local variable to refarance stage

        public function loadeimage(StageObject:Object, Url:String){ //StageObject will bring the stage refarance into the class

            var reQuest:URLRequest = new URLRequest(Url);
            loader.load(reQuest);

            stageObj=StageObject; //make local refarance for stage inside the class

            var image:Bitmap;
            image=Bitmap(loader.content);

            image.x = 100;
            image.y = 100;

            stageObj.addChild(image); // add whatever object into stage refarance and this means the real stage..

        }
    }

}

コメントのあるものだけが重要で、このファイルを ImageLoader.as として保存し、インポートしてこのように使用できます。

import ImageLoader;

var IL:ImageLoader = new ImageLoader();
IL.loadeimage(this,"img.jpg");

そのように簡単です。これはあなたが探しているものだと思います...頑張ってください。(任意のコンテナまたは親コンテナ this または this.stage を渡すことができます。お子様がその一部になるかどうかは問題ではありません。

于 2016-11-19T09:36:13.040 に答える
0

as3 のドキュメントにあるように、「ステージ オブジェクトはグローバルにアクセスできません。DisplayObject インスタンスのステージ プロパティを介してアクセスする必要があります。」

代わりに、ステージ オブジェクトへの参照を Displayer クラスに渡す必要があります。ドキュメントにあるように、表示オブジェクト インスタンスを介してステージ オブジェクトへの参照を取得できます。

したがって、コンストラクターは次のようになります。

function Displayer( stage:Stage )
{
    _stage = stage;
}

Displayer をインスタンス化するオブジェクトがステージの子であると仮定すると、次の方法で Displayer をインスタンス化できます。

displayer = new Displayer( stage );

このアプローチを使用する場合、 Displayer クラスを拡張したり、ステージに追加したりする必要はありません (これは、 bitmapdata.com のアプローチで必要になります)。

于 2013-02-05T14:25:47.330 に答える