2

ステージ上には、単純な長方形が描画された「mc」という名前の MovieClip があります。mc には、別の単純な四角形 (明らかに mc の四角形よりも小さい) である "btn" という名前の Button 子もあります。次に、このコードをステージに置きます。

function mcDown( _e:MouseEvent):void{
    trace( "mc" );
}
function btnClick( _e:MouseEvent):void{
    trace( "btn" );
}
mc.addEventListener( MouseEvent.MOUSE_DOWN, mcDown );
mc.btn.addEventListener( MouseEvent.CLICK, btnClick );

私が抱えている問題は、ボタンをクリックすると、mcDown イベントもトリガーされ、「mc」と「btn」の両方がトレースされることです。

ボタンをクリックすると、btnClick のみがトリガーされ、mcDown はトリガーされないようにするにはどうすればよいですか? 同じ問題で、CLICK の代わりに MOUSE_UP を試しました。また、mcDown イベントは MOUSE_DOWN のままでなければなりません。

4

2 に答える 2

1

dispatchEvent で bubbles パラメータを false に設定する以外に、バブリングを防止する方法はありません。

dispatchEvent(EVENT_TYPE, BUBBLES,....);

ただし、チェックを行うことでバブリングを回避できます。以下の行をリスナー関数の最初の行として使用するだけで、ターゲット以外のすべてのオブジェクトからディスパッチされるイベントを回避できます。

if(e.eventPhase != EventPhase.AT_TARGET) return;

したがって、サンプルコードでは、ボタンをクリックすると両方のイベントがディスパッチされますが、mcDown関数では上記の行の後に実行されません。

于 2012-09-10T11:55:01.097 に答える
0

MC にボタンを追加し、ボタンをクリックすると、MC もクリックされます。これは、ボタンの下にある MC の部分がまだそこにあり、MC 全体の機能を実行するためです。取り除かない。

そのため、ボタンが押されたかどうかをチェックする関数を作成することをお勧めします。押されていない場合は、MC 全体に対して関数を実行します。

こいつはやるべき。

//add this in you constructor

mc.addEventListener(MouseEvent.MOUSE_DOWN, myReleaseFunc);
function myReleaseFunc(e:MouseEvent):void {
    if(e.currentTarget.name == Btn1) //Btn1 is instance name for a button
    {
         Btn_func1();
    }
    else if(e.currentTarget.name == Btn2) //Btn2 is another button.
    {
         Btn_func2();
         //For every button you'll need to add another function and if statement to check if that button was clicked.
    }
    else
    {
         Mc_func();
    }

} 

// this outside the main class

function Mc_func():void{
    //you code here
}
function Btn_func1():void{
    //you code here
}
function Btn_func2():void{
    //you code here
}

この方法ははるかに効率的であり、より適切かつ高速に機能し、システムに過負荷がかかる可能性がはるかに少なくなると思います.

于 2012-09-09T14:40:35.363 に答える