好问题!
我做了一个快速测试。有一种称为getObjectsUnderPoint()方法,其
返回位于 指定点下,并且是 孩子(或孙子,等等)对象的数组该DisplayObjectContainer的 实例
根据到文档。
而且
是 无法进入安全考虑任何子对象 从返回数组省略。到 确定此安全 限制是否影响返回 阵列,调用 areInaccessibleObjectsUnderPoint() 方法。
所以我不知道这可能有多大的帮助。
这里是我的测试还是:
//make some clips interactive
for(var i:int = 0 ; i < numChildren ; i+=2){
MovieClip(getChildAt(i)).mouseEnabled = true;
MovieClip(getChildAt(i)).buttonMode = true;
MovieClip(getChildAt(i)).mouseChildren = false;
}
//reuse this array
var clips:Array;
addEventListener(Event.ENTER_FRAME, checkClickables);
function checkClickables(event:Event):void {
clips = this.getObjectsUnderPoint(new Point(mouseX,mouseY));
for(i = 0 ; i < clips.length ; i++){
if(isInteractiveObject(clips[i])){
trace(clips[i]);
}
}
}
function isInteractiveObject(object:*):Boolean{
var extendsClass:XMLList = describeType(object).extendsClass;
for each(var classDef:XML in extendsClass){
if([email protected] == 'flash.display::InteractiveObject') return true;
}
return false;
}
我在舞台上的一些片段,我正在做一些他们的“点击”。 的onEnterFrame然后我检查是否有InteractiveObject的子类 (超类的任何东西可点击)
的任何实例出于某种原因,在我的测试,getObjectsUnderPoint()只返回形状对象,没有精灵。 也许它可能在你的配置中工作。
此外它似乎有点复杂。
这里是我的第二个方法:
function getInteractiveObjects(container:DisplayObjectContainer):Array{
var result:Array = [];
for(var i:int = 0 ; i < container.numChildren ; i++){
if(container.getChildAt(i) is Sprite || container.getChildAt(i) is MovieClip) result.push(container.getChildAt(i));
if(container.getChildAt(i) is DisplayObjectContainer){
var clips:Array = getInteractiveObjects(DisplayObjectContainer(container.getChildAt(i)));
var clipsNum:int = clips.length;
for(var j:int = 0 ; j < clipsNum ; j++)
if(clips[j] is Sprite || clips[j] is MovieClip) result.push(clips[j])
}
}
return result;
}
使用递归函数获取潜在目标的交互剪辑一个内部(如加载的内容)。如果它是Sprite或MovieClip,它是'可点击的'。
var iclips:Array = getInteractiveObjects(this);
for(i = 0 ; i < iclips.length ; i++){
trace(iclips[i].name);
//do extra tests here
if(iclips[i].hasEventListener(MouseEvent.ROLL_OVER)) trace(iclips[i].name + ' has roll over');
//etc.
}
那么你可以做额外的测试,这取决于正是你要寻找的(无论它有和事件侦听器的鼠标事件,要么是将mouseEnabled,具有buttonMode设置为true,等等)
这样你就不需要检查任何鼠标了(不必等待用户交互或者始终调用一个函数),一旦你得到的剪辑不符合你的想法,你可以改变他们的行为(mouseChildren = false,或其他)。
HTH