2016-12-12 11 views
1

私は非常に単純なプログラムをコーディングしていました。このプログラムでは、円の周りを動かすことができ、ステージの矩形も移動できます。私はあなたがそれをドラッグしている間に円を矩形の前にしたいと思っていましたが、あなたがマウスを離したときに円が戻されました。getChildIndexをas3で使用してパブリック変数を設定するにはどうすればよいですか?

getChildIndexメソッドを使用してパブリック変数を設定する方法がわかりません。私はコードの残りの部分については本当に気にしません。私は主に、getChildIndexメソッドをパブリック変数で動作させることができるかどうかに興味があります。

package code 
{ 

    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import flash.display.Sprite; 


    public class Main extends MovieClip 
    {   
     public var myCircleIndex:int = getChildIndex(myCircle); 

     public function Main() 
     { 
      myCircle.addEventListener(MouseEvent.MOUSE_DOWN, mouseClicking); 
      stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); 
     } 

     public function mouseClicking(e:MouseEvent): void 
     { 
      myCircle.startDrag(); 
      setChildIndex(myCircle, numChildren-1); 
     } 

     public function mouseReleased(e:MouseEvent): void 
     { 
      myCircle.stopDrag(); 
      setChildIndex(myCircle, myCircleIndex); 
     } 
    } 
} 

私はステージで直接ムービークリップとして作成したインスタンス( "myCircle")を使用しています。

私は最初に設定したpublic varに問題があります。私はmyCircleの子インデックスを取得できませんが、同じ行を関数内に置くと動作します。
私は、最後の行にmyCircleのインデックス番号を直接置くことができます(そしてpublic var myCircleIndexを消去することができます)。しかし、getChildIndexをクラスのpublic varに使用する方法があるとわかりました。

クラス内のpublic変数でgetChildIndexをどのように使用しますか?

+0

あなたは、正方形の後ろに円を入れてやらなければならないことははaddChild(四角)またはaddChildAt(円、0を行うのリリースであります); –

+0

あなたは私の意見で変数を追跡しようとすることで事態を複雑にしています。舞台裏でフラッシュを並べ替えましょう。 –

+0

もう少し精巧で、正方形のすぐ後ろに円を置いておきたい場合は(100のレイヤーがあり、正方形がレベル12にありますが、どのレベルが正方形かわからない場合) addChildAt(circle、getChildIndex(square)-1); ' –

答えて

3

なぜ機能しないのは、public var myCircleIndex:intという行が実行されているときにタイムラインオブジェクトが存在しないためです。

このような理由から、クラスレベルの変数宣言内のプリミティブでないオブジェクトにはアクセスしないでください。クラス内の他のものは、それらの変数がまだ作成されていないため使用できません。ここで

は(コードのコメントを参照してください)あなたがこれをリファクタリングする方法である。

public class Main extends MovieClip 
{   
    public var myCircleIndex:int; //just create the reference here, don't assign it 
    public var myCircle:flash.display.DisplayObject; //this line is just for better compile time checking and code completion, completely optional 

    public function Main() 
    { 
     //wait for all the display stuff to be created before trying to access it. The constructor function can run before timeline stuff is created, so it's not safe to reference stage or timeline objects here. 
     if(!stage){ 
      this.addEventListener(Event.ADDED_TO_STAGE, timelineCreated); 
     }else { 
      timelineCreated(null); 
     } 
    } 

    private function timelineCreated(e:Event):void { 
     //now that we're certain the timeline stuff has been created, we can reference timeline objects and stage: 

     //store the initial z-index of myCircle 
     myCircleIndex = getChildIndex(myCircle); 

     //the rest of your code that was in the construction -Main()- before 
     myCircle.addEventListener(MouseEvent.MOUSE_DOWN, mouseClicking); 
     stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); 
    } 

    //no change to any of the following stuff 

    public function mouseClicking(e:MouseEvent): void 
    { 
     myCircle.startDrag(); 
     setChildIndex(myCircle, numChildren-1); 
    } 

    public function mouseReleased(e:MouseEvent): void 
    { 
     myCircle.stopDrag(); 
     setChildIndex(myCircle, myCircleIndex); 
    } 
} 
+0

本当に私を助けてくれてありがとう、私の質問に答えるためにありがとう:) – m5signorini

2

あなたは、正方形の後ろに円を入れてやらなければならないことは、リリースであるあなたは私の意見では、変数を追跡しようとすることで、物事が複雑になり過ぎているaddChild(myRectangle)またはaddChildAt(myCircle, 0);

を行います。舞台裏でフラッシュを並べ替えましょう。

もう少し精巧にしたいだけで、正方形のすぐ後ろにサークルを置いてください(100のレイヤーがあり、正方形がレベル12にありますが、正方形がどのレベルであるかわからない場合)

addChildAt(myCircle, getChildIndex(myRectangle)-1); 

ノート

setChildIndex(myCircle、するnumChildren-1)を行うことができます。

このようにしても問題ありません。これを行う一般的な方法はちょうどです

addChild(myCircle); 

これはまったく同じことです。多くの人々は、これが新しいmyCircleを追加するという考え方を混乱させていますが、すでに表示リストに入っている場合は前面に表示され、表示リストにない場合は、表示リストに追加されます。 order(numChildren-1)

+0

これは良い答えですが、円のz-インデックスを追跡する必要がある理由はたくさんあります。たとえば、円に他の兄弟(矩形の外にある)がある場合、ドラッグされていないときは後ろにする必要があります。あなたがそれが過度に複雑であると結論付けるのに十分な情報を持っているかどうかは分かりません。 – BadFeelingAboutThis

関連する問題