2

How can I access the stage and especially the width and mouse position of the flash Movie from a custom class?

package classes
{
   import flash.events.*;
   import flash.display.*;

   public class TableManager extends Sprite
   {
        public function TableManager() {
            sayStage();
        }
        public function sayStage():void 
        {
            trace(stage);
        }
  }   
} 

This will only return nill. I know that DisplayObjects don't have any stage until they have been initiated so you can't access the stage in your constructor but even if I call sayStage() later as an instance method it won't work.

What am I doing wrong?

4

7 に答える 7

7

TableManagerがステージ上にある場合は、を使用してステージにアクセスできますthis.stage

秘訣は、インスタンスがステージに追加されるのを待つ必要があることです。イベントを聞くことができるADDED_TO_STAGEので、それがいつ起こったかを知ることができます。

package classes {
import flash.events.*;
import flash.display.*;

public class TableManager extends Sprite {
    public function TableManager() {
        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(e:Event):void {
        this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        sayStage();
    }

    public function sayStage():void {
        trace(this.stage);
    }
}   
}
于 2011-12-29T19:24:17.203 に答える
3

これを書くための最も防御的な方法は次のとおりです。

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

private function init(e:Event = null):void {
    if(e != null) this.removeEventListener(Event.ADDED_TO_STAGE, init);
    sayStage();
}

初期化時にオブジェクトがすでにステージ上にある場合は、init引数なしですぐに関数を呼び出します。そうでない場合は、ステージに追加されるまで待ちます。次に、init関数が呼び出されたときに、イベントの結果として呼び出された場合は、イベントハンドラーをデタッチして、先に進みます。

于 2011-12-30T15:59:47.997 に答える
0

これは非常に優れたソリューションです。クラス内のステージを参照するだけで済み、単純なオブジェクトとして渡すだけです。ここでその方法を説明します

package  {

    public class Eventhndl{

        private var obj:Object;

        public function Eventhndl(objStage:Object):void{
            obj = objStage;

            trace(obj); // now the obj variable is a reference to the stage and you can work as normal you do with stage (addChild, Events Etc..)

        }

}

これは、実行するインスタンスを作成する方法です。コンストラクター メソッドを使用しましたが、必要に応じて任意の関数に変更し、必要なときにいつでも呼び出すことができます。

import Eventhndl;

var EH:Eventhndl = new Eventhndl(stage);

クラスからステージにアクセスする方法のいくつかの例を次に示します

https://stackoverflow.com/a/40691908/1640362

https://stackoverflow.com/a/40691325/1640362

于 2016-11-19T10:51:12.653 に答える
0

ルート ムービークリップ (ステージ) の参照をカスタム クラスに渡すことができます。

例えば

package classes
{
   import flash.events.*;
   import flash.display.*;

   public class TableManager extends Sprite
   {
       private var _rootMC:MovieClip; 

       public function TableManager(rootMC:MovieClip) {
            _rootMC = rootMC;
            sayStage();
        }
        public function sayStage():void 
        {
            trace(_rootMC.stage);
            trace(_rootMC.stage.stageWidth);
        }
  }   
} 

次に、ルート タイムラインから TableManager のインスタンスをインスタンス化する場合:

//the keyword 'this' is the root movieclip.
var newTM:TableManager = new TableManager(this);
于 2011-12-29T19:12:41.180 に答える
0

現在のオブジェクト (スプライトでもある) が既にステージにアタッチされている場合、this.stage にアクセスできます。

public class TableManager extends Sprite{
    public function TableManager()
    {
    }
    public function sayStage():void 
    {
        trace(stage);
    }
}
TableManager tm=new TableManager();
//tm.sayStage();  // no
addChild(tm);  
tm.sayStage();  // fine

これが役立つことを願っています

于 2011-12-30T06:36:41.323 に答える
0

ステージへの静的参照を作成する必要がある場合に便利だと思います:

メインクラスに行を追加してステージを設定します:

public static var stage:Stage;
...
public function Main():void { // constructor
     Main.stage = stage;
     ...

カスタムクラスよりも:

public function sayStage():void 
        {
            trace(Main.stage);
            trace(Main.stage.stageWidth);
        }
于 2011-12-29T20:51:19.950 に答える
0

stageSpriteが表示リストに追加されていない限り、null になります。開始とは関係ありません。例えば

var t:TableManager = new TableManager;
stage.addChild( t ); // or your root class, or any class that's already on the displaylist
trace( t.stage ); // [Stage stage]
t.parent.removeChild( t );
trace( t.stage ); // null

@ crooksy88が示唆するように、ステージをコンストラクターに渡すか、メインドキュメントクラスなどのどこかに静的として保持して、どこからでもアクセスできるようにします。

于 2011-12-29T19:19:28.007 に答える