コンテナー ムービークリップ自体のステージ (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 があるかどうかを確認できます。、それから免除配列を作成し、上記と同じロジックを使用して免除配列内の項目を無視します。