0

その場で既存の SWF に MovieClip を追加しようとしています。次のような小さなコードを挿入します。

this.obj = new MovieClip(); // it is inside an object
obj.name = 'FLOOR';
obj.graphics.beginFill(0xFFFFFF, 0);
obj.graphics.drawRect(0,0,self.width, self.height);
obj.graphics.endFill();
obj.buttonMode = true;
self.addChildAt( floorLayerMC , 0); /* self is an reference for the this keyword, reference for the entire swf */

私の質問は、この SWF には画像やテキスト フィールドなどの多くの要素があり、この要素の一部にはクリック用のイベント ハンドラがないということです。イベントのバブリングなどを使用して、すべてのイベントを「FLOOR」要素に「リダイレクト」する方法を見つける必要があります。

もちろん、任意の要素の上に FLOOR を追加できますが、クリック ハンドラを持つ要素がいくつかあります。すべての要素を無視することはできません。だから私の問題は:

クリック ハンドラーでムービークリップをクリックすると、元のアクションが実行されます。クリック ハンドラーなしで MovieClip をクリックすると、FLOOR アクションが実行されます。

すべての要素にイベント ハンドラを追加できません。

何か案が?

4

1 に答える 1

0

コンテナー ムービークリップ自体のステージ (FLOOR を含むムービークリップ) のクリックをリッスンします。クリック イベントのハンドラー メソッドで、コンテナー ムービークリップの mouseX と MouseY で hitTestPoint を使用してヒット テストを実行し、マウスがクリック可能なオブジェクトの上にある場合は、ステージ クリックを無視します。そのテストを行うために、クリック可能なすべてのオブジェクトを配列に格納します。

このコードはテストされていませんが、次のようになります。

var exemptArray:Array = [ btn_mc1, btn_mc2, btn_mc3 ];
containerMC.stage.addEventListener(MouseEvent.CLICK, onClickMyMC);

function onClickMyMC( event:Event ):void
{
    for(var i:int = 0; i < exemptArray.length; i++)
    {
        if( exemptArray[i].hitTestPoint(containerMC.mouseX, containerMC.mouseY) )
        {
            // do nothing, ignore the stage click ( and let the object with the click respond )
            break;
        }
        else
        {
            // respond to the stage click
        }
    }
}

どのオブジェクトがクリック可能かを事前に知らずに免除配列を構築するには: (未テストですが、アイデアを得るのに十分近いはずです)。

var exemptArray:Array = buildExemptArray();

function buildExemptArray():Array
{
    var arr:Array = [];

    for(var j:int = 0; j < containerMC.numChildren; j++)
    {
        if( containerMC.getChildAt(i).hasEventListener(MouseEvent.CLICK) )
        {
            arr.push( containerMC.getChildAt(i) );
        }
    }

     return arr:
}

コメントで質問に答えるために編集:

this.addEventListener(MouseEvent.CLICK, onClick)は、子を含むオブジェクト全体にクリック イベントを追加します。

this.stage.addEventListener(MouseEvent.CLICK, onClick)は、ムービークリップのステージのみにクリックを追加し、その子にはクリックを追加しません

as3 では、すべてのムービークリップにステージ プロパティがあります。メインのタイムラインに書いた場合this.stage.addEventListener(MouseEvent.CLICK, onClick); これは、swf 全体にステージ クリックを追加することになります。しかし、myMC.stage.addEventListener(MouseEvent.CLICK, onClick); のようなものを書いた場合 そのムービークリップのステージ (myMC のステージ) にクリックを追加するだけです。ステージは表示リストの下にあるため、任意のムービークリップでクリックをキャプチャできます。事前にマウス イベントを持つすべてのオブジェクトにアクセスできない場合は、すべてのコンテナーの子をループして、.hasEventListener(MouseEvent.CLICK);で mouseEvent があるかどうかを確認できます。、それから免除配列を作成し、上記と同じロジックを使用して免除配列内の項目を無視します。

于 2012-11-15T18:55:29.623 に答える