2011-11-28 13 views
0

私が描いているクリップがステージに追加されています。クリックすると、それ自体が子として2つ複製されます。これらの子をクリック可能にしたいのですが、クリックすると親クリックとその子の両方としてクリックが登録されるという問題があります。それで、2つの新しいクリップを追加するのではなく、4を追加します。movieChipにmouseChildren = falseを追加することでこれを解決できますが、それを行うと、新しいクリップは親クリップの中心からクリックされたクリップの原点。これをどうやって解決するのですか?これは私のコードです:表示リスト内のMouseEventsバブルアップ(つまりは、それらが階層的に上向きに転送されます)ので、イベントリスナーは、1つのオブジェクトのみに登録されているflash as3 mouseChildren issue

function clickCircle(e:MouseEvent):void { 
    var thisCircle = e.target; 
    for (var i=0; i<thisCircle.childCircles;i++){ 
     trace('drawCircle' + i); 
     drawCircle(thisCircle); 
    } 
} 

function drawCircle(parentCircle){ 

    //trace('draw circle' + childCircles); 
    var xPos; 
    var yPos; 
    if (circleCount == 0){ 
     xPos = centerStageX; 
     yPos = centerStageY; 
    } else { 
     //xPos = parentCircle.x; 
     //yPos = parentCircle.y; 
     xPos = yPos = 0; 
    } 

    var newCircle:Shape = new Shape(); 
    newCircle.graphics.beginFill(circleColor); 
    newCircle.graphics.drawCircle(0,0,cr); //x, y, radius 
    newCircle.graphics.endFill(); 

    var circleClip:MovieClip = new MovieClip(); 
    //circleClip.mouseChildren = false; 
    circleClip.childCircles = numCircles; 
    circleClip.x = xPos; 
    circleClip.y = yPos; 
    circleClip.addChild(newCircle); 
    circleClip.id = circleCount; 
    if (circleCount == 0){ 
     addChild(circleClip); 
    } else { 
     parentCircle.addChild(circleClip); 
    } 

    circleArray.push(circleClip); 
    circleClip.addEventListener(MouseEvent.CLICK,clickCircle); 
    if (circleCount != 0){ 
     moveCircle(parentCircle,circleClip,xPos,yPos); 
    } 
    circleCount++; 
} 

答えて

2

が、それはその子からclickイベントを受け取りますしたがって、それぞれの親オブジェクトはステージであってもイベントを受け取ります。

これを防ぐには、イベントの伝播を明示的に停止する必要があります。 ActionScriptのイベントは、この2つの方法がある:

stopPropagation

==>currentTarget、すなわち、他のオブジェクト(後で実行するノードで受信されるのイベントを停止しますが、火災に同じオブジェクト内の他のリスナーを可能にします。

stopImmediatePropagation

==>にかかわらず、聞いている他の誰の、それが受信された時点でイベントを停止します。

あなたのコードに含まれているもの以外のことをするつもりでない限り、それらの両方がうまくいくはずです。追加のノートで

function clickCircle(e:MouseEvent):void { 

    // --- This should stop the event from bubbling up in the display list 
    e.stopPropagation(); 

    var thisCircle = e.target; 
+0

:だからあなたのclickCircleハンドラで、1行を追加します。あなたはMyCircleクラスにこのコードをラップ検討すべきである - タイムラインベースのActionScriptでの作業は、私はシンプルな '停止(に制限するものです)'プログラムの 'gotoAndPlay()'のようなものです。 ActionScriptでさらに作業を行う場合は、次のチュートリアルをご覧ください:http://www.adobe.com/devnet/flash/quickstart/creating_class_as3.htmlまたはこのビデオ:http://www.adobe.com/ devnet/flash/articles/first_as3_class.html – weltraumpirat

+0

ありがとうございます。うん、これは単なる実験のように始まりましたが、少し広範囲になるようになったので、私はコードをリファクタリングして再構成します。私は前にstopPropagationメソッドを見たことがない、それは非常に便利です。 – mheavers