聆听对容器影片剪辑自己的舞台(包含 FLOOR 的影片剪辑)的点击。在单击事件的处理程序方法中,使用 hitTestPoint 和容器动画剪辑的 mouseX 和 MouseY 进行命中测试,如果鼠标悬停在任何可单击对象上,则忽略舞台单击。将所有可点击的对象存储在一个数组中以进行该测试。
这段代码未经测试,但它会是这样的:
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
}
}
}
在不知道哪些对象可以提前点击的情况下构建exemptArray:(未经测试,但应该足够接近给你一个想法)。
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 中,所有的movieclips 都有一个stage 属性。如果你在主时间线上写this.stage.addEventListener(MouseEvent.CLICK, onClick); 这将在整个 swf 中添加一个舞台点击。但是,如果你写了类似myMC.stage.addEventListener(MouseEvent.CLICK, onClick); 它只会向该影片剪辑的舞台(myMC 的舞台)添加一次点击。由于舞台位于显示列表下方,因此您可以在任何影片剪辑中捕捉点击。如果您无法提前访问所有具有鼠标事件的对象,则可以循环遍历所有容器的子对象,并使用.hasEventListener(MouseEvent.CLICK); 检查它们是否具有 mouseEvent;,从中创建您的 excludeArray,然后使用上述相同的逻辑来忽略 excludeArray 中的项目。