Actionscript 3.0:以严格模式显示对象walker

时间:2009-04-14 22:45:40

标签: actionscript-3

这是显示对象步行者的文档类。测试课程时,请务必将关闭严格模式(howto here)。还把一些东西放在舞台上。当严格模式关闭时,对象walker工作得很好。但是,我想让它在严格模式下工作。我试过更改有问题的部分和addig(dispObj作为DisplayObject),没有运气。

package {

    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;

    public class DisplayWalker extends MovieClip {

        public function DisplayWalker() {
            showChildren(stage, 0);
        }



        private function padIndent(indents:int):String {
            var indent:String = "";
            for (var i:uint = 0; i < indents; i++) {
                indent += "        ";
            }
            return indent;
        }

        private function showChildren(dispObj:DisplayObject, indentLevel:Number):void {
            for (var i:uint = 0; i < dispObj.numChildren; i++) {
                var obj:DisplayObject = dispObj.getChildAt(i);
                if (obj is DisplayObjectContainer) {
                    trace(padIndent(indentLevel), obj, obj.name);
                    showChildren(obj, indentLevel + 1);
                } else {
                    trace(padIndent(indentLevel), obj);
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

您的类将在严格模式下生成编译时错误,因为您正在尝试访问numChildren和getChildAt方法,这些方法在DisplayObject类上不可用,但首先访问其中一个子类DisplayObjectContainer。

它在非严格模式下工作的原因是,在运行时,您实际上是在传递DisplayObjectContainer(Stage,Sprite等)的子类。

只需将DisplayObject替换为DisplayObjectContainer作为showChildren方法中dispObj的类型。 DisplayObjects不能有子项,并且始终是显示对象树中的叶子,这是showChildren方法必须考虑的内容。

答案 1 :(得分:1)

Stiggler在正确的轨道上,但是没有看到你已经检查过DisplayObjectContainers。

您只需稍微修改一下代码即可。我没有测试代码,但无论如何你应该能够弄明白;)

private function showChildren(dispObj:DisplayObject, indentLevel:Number):void
{
    var dOC:DisplayObjectContainer = dispObj as DisplayObjectContainer;

    if(dOC == null)
    {
        trace(padIndent(indentLevel),obj);
    }
    else
    {    
        trace(padIndent(indentLevel), obj, obj.name);

        var obj:DisplayObject = null;

        for (var i:uint = 0; i < dispObj.numChildren; i++)
        {
            obj = dOC.getChildAt(i);
            showChildren(obj, indentLevel + 1);
        }
    }
}