如果将动画添加到动态添加的影片剪辑中,则MovieClip不会保留其类

时间:2010-12-19 01:19:22

标签: flash actionscript-3 cs4

我有一个持有者movieclip,它的基类是foo。

package {
    import flash.display.MovieClip;

    public class Foo extends MovieClip {
        public function Foo() {
            trace("foo");
        }
    }
}

在foo中有许多其他的动画片段,其基类为bar。

package {
    import flash.display.MovieClip;

    public class Bar extends MovieClip {
        public function Bar() {
            trace("bar");
        }
    }
}

我在条形图的构造函数中添加了一条轨迹,以便我可以判断它是否正确加载,当我将foo拖到场景上并运行剪辑时,其中的所有小条都会正确启动。但是,当我动态地将它添加到场景中时,例如Main类中的这样:

package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        public function Main() {
            this.addChild(new Foo());
        }
    }
}

突然之间,foo中的所有小酒吧电影片段都会恢复到常规的老电影片段并且不会开火。有什么方法可以解决这个问题吗?

您可以在这里下载一个示例文件,其中包含一些额外的痕迹,以展示正在发生的事情:http://www.megaupload.com/?d=T2R10FJN 它仍然有它的子节点,它们被添加和显示,但它们的类型更改为MovieClip,忽略了基类。

1 个答案:

答案 0 :(得分:0)

getChildAt()返回一个DisplayObject。要访问任何Bar方法/属性,您需要将其显式地转换为Bar对象。

使用您的代码示例...

public class Main extends MovieClip {
    public function Main() {
        var foo:Foo = new Foo();
        stage.addChild(foo);
        foo.x = 0;
        foo.y = 0;

        trace(foo.getChildAt(1) as Bar);
    }//Main()
}

奇怪的是,(非常奇怪)我刚刚注意到Flash没有运行Bar的自定义构造函数,除非有代码SOMEWHERE将Foo中的那些对象声明为Bar类型。通过简单地修改上面的一个trace语句(以便它转换getChildAt的返回),Foo中存在的所有Bar对象都运行它们的自定义构造函数。去图。