AS3:如何递归跟踪舞台上的所有MovieClip

时间:2015-03-23 20:05:03

标签: actionscript-3 flash recursion air

我有一个Adobe Air项目,其中包含许多可以添加(通过addChild())或删除(通过removeChild())的MovieClip。出于调试目的,我想获得当前舞台上所有MovieClip的快照(可见或不可见)。

输出应采用缩进的树状格式,显示MC名称(如果可用),可见性状态以及此MC为其实例的库对象。

trace / debug函数应该是递归的,以便不限制到一定数量的级别。

以下是示例输出:

|1| featureStage     visible: true  [object MovieClip]
    |2| mcName1  visible: true  [object syndicationRHS_2]
    |2| mcName3  visible: false [object VideoScreen]
        |3| toolbox  visible: false [object toolboxMC_126]
            |4| bgColorImg   visible: true  [object MovieClip]
            |4| fontColorImg     visible: false [object MovieClip]
            |4| calendar     visible: false [object MovieClip]
        |3| tabDesign    visible: true  [object TabDesign_130]
        |3| designBox    visible: false [object MovieClip]

该项目有多个类(.as)文件,我希望能够从项目的任何地方调用此例程。

经过一段时间的搜索,我发现了一些有助于我在下面创建答案的想法。

2 个答案:

答案 0 :(得分:0)

这是代码。它专门查找MovieClip对象,但是如果需要,可以修改它以查找其他对象类型。希望这会有所帮助。

main.as类定义中:

public var __childDepth:int;

同一个类模块中的公共函数

public function showAllChildren(mc:MovieClip)
{
    var numC = mc.numChildren;
    var tabStr:String = "";

    for (var t = 0; t < __childDepth; t++)
    {
        tabStr = tabStr + "\t";
    }

    for(var i = 0; i < numC; i++)
    {
        var child = mc.getChildAt(i); 
        if (child is MovieClip) {
            trace (tabStr
                + '|' + __childDepth + '| ' + mc.getChildAt(i).name
                + '\t visible: ' + mc.getChildAt(i).visible
        //      + '\t type:' + typeof (mc.getChildAt(i))
                + '\t' + mc.getChildAt(i));
        }

        if (child is MovieClip && child.numChildren > 0)
        {
            __childDepth ++;
            showAllChildren (child);
            __childDepth --;
        }
    }
}

然后在另一个(或相同的)类模块中:

objGrandParent.__childDepth = 1;
objGrandParent.showAllChildren(MovieClip(root));    

objGrandParent在哪里宣布showAllChildren。就我而言,它是我引用的父母的父母。我想从舞台开始显示所有MC,因此传递给该函数的MC是MovieClip(root)

答案 1 :(得分:0)

您应该存储对数组中所有内容的引用以进行引用。你会发现它清除了这些问题。

以下是在数组中存储按钮的示例:

var aButtons: Array = new Array();

for (var i = 0; i < aButtons.length; i++) {
    var mcNewButton: MyButton = new MyButton();
    mcButtons.addChild(mcNewButton);
    mcNewButton.x = i * 100;
    mcNewButton.iButtonID = i;
    mcNewButton.tMaintText.text = "Button " + i;
    mcNewButton.addEventListener(MouseEvent.MOUSE_DOWN, fButtonPress);
    aButtons.push(mcNewButton);
}

function fButtonPress(e:MouseEvent):void {
    trace("fButtonPress: iButtonID: " + e.target.iButtonID);
}

然后你可以引用这样的属性:aButtons [i] .iButtonID

您将看到所有代码都清除,包括轻松检查/设置可见的属性。