学习网站建设,网页知识,电脑技巧,AS3代码,FLASH效果,课件制作,网络学习,运动生活,心情日志博客
2010年07月19日AS3 学习

2 条评论

AS3遍历舞台中的所有显示对象

  AS3遍历舞台中的所有显示对象:今天在《AS3入门与精通》第202页看到用递归来遍历舞台的显示列表的方法,尝试把代码打了一遍,结果报错:1119: 访问可能未定义的属性 numChildren (通过 static 类型 flash.display:DisplayObject 引用)。1061: 调用可能未定义的方法 getChildAt (通过 static 类型 flash.display:DisplayObject 引用)。去掉“严谨模式”的钩之后,输出:

root1
instance1
instance2
ReferenceError: Error #1069: 在 flash.display.Shape 上找不到属性 numChildren,且没有默认值。
 at _fla::MainTimeline/tracedp()
 at _fla::MainTimeline/tracedp()
 at _fla::MainTimeline/tracedp()
 at _fla::MainTimeline/tracedp()
 at _fla::MainTimeline/_fla::frame1()

  后来就这个问题请教了一下我的安徽老乡,因为她很聪明的。果然,老乡马上就发现是Shape而不是容器的原因。经她提醒,我想到在舞台上创建的各个影片剪辑实例虽然有嵌套关系,但它们的最里层都是用创作工具画的图,这些图的确没有numChildren属性。可是怎么办呢?

  老乡说可以加个判断,在确认子实例是容器时再递归调用。这办法还真好用,我加了一句,这个问题解决了。

  最后代码如下:

tracedp(stage);
//传入实参,stage,最顶层的容器
function tracedp(dp:DisplayObject):void {
var len:int=dp.numChildren;
//保存容器的子实例的个数
if (len) {
//当子对象不为0时开始循环
for (var i:int=0; i<len; i++) {
var d:DisplayObject=dp.getChildAt(i);
//获取所有的子实例
trace(d.name);
//输出实例的名字
// tracedp(d);  
  (d is DisplayObjectContainer)?tracedp(d):0;
   //当子实例的类型也是显示对象容器时,递归调用本函数

  }
 }
}

  但是要注意:这段代码也仅仅是在非“严谨模式”下可以测试,因为指定的函数的形参类型是DisplayObject,这种类型并不一定就是容器,所以“严谨模式”下会报第4行和第9行错误。(同上方:访问可能未定义的属性numChildren和调用可能未定义的方法getChildAt(i))

本文地址:http://www.lxlong.net/archives/2373.html

本文标题:AS3遍历舞台中的所有显示对象

 
« »                

2条评论

  1. lxlong.net 说:

    学习了,很棒的代码!

  2. xinje 说:

    我把你的代码改了一下。不需要什么非“严谨模式”。转换一下类型就好了。
    你的代码给我很大启发。

    tracedp(Object(root) as MovieClip);
    //传入实参,stage,最顶层的容器
    function tracedp(dp:MovieClip):void
    {
    var len:int = dp.numChildren;
    //保存容器的子实例的个数
    if (len)
    {
    //当子对象不为0时开始循环
    for (var i:int=0; i<len; i++)
    {
    var d:DisplayObject = dp.getChildAt(i);
    //获取所有的子实例
    trace(d.name);
    //输出实例的名字
    // tracedp(d);
    (d is DisplayObjectContainer)?tracedp(d as MovieClip):0;
    //当子实例的类型也是显示对象容器时,递归调用本函数
    }
    }
    }

发表评论 »