2010-12-19 55 views
1

我有一个动画片段持有者,其基类为foo。如果拼接到动态添加的动画片段,则动画片段不保留其基类

package { 
    import flash.display.MovieClip; 

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

在FOO一些其他的movieclip的,用碱的类BAR的。

package { 
    import flash.display.MovieClip; 

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

我把一丝杆的构造函数,因此,如果它被正确加载,我可以告诉,当我拖出富到现场,并运行剪辑,都在它的小酒吧火了正常。然而,当我在主类将其添加到现场动态,比如像这样:

package { 
    import flash.display.MovieClip; 

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

突然间,所有foo中的小酒吧影片剪辑恢复到普通的旧影片剪辑和不火。有趣的是,如果你在某个时间点将它们当作Bar,并且它们的普通类设置为Bar(在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() 

但是,如果你想要多个不同类型的Bar剪辑,并给每个Bar的基类,这是行不通的。它们都作为通用影片剪辑产生。如果你将它们作为Bar1或Bar2进行类型化,它会起作用,但这意味着在实践中,每次将剪辑添加到舞台上时,都必须尝试将每个孩子都视为每个顶级对象类型。由于Flash不允许,所以你也不能拥有一组相同类型的影片剪辑,所以每一个都需要成为一个新类,并且当父类放置在舞台上时,该类将被类型化。这种打败OOP的目的。

这似乎是Flash本身的错误,但有什么办法解决它吗?

您可以在这里下载一个示例文件,附带一些额外的痕迹以展示发生了什么:http://www.megaupload.com/?d=1YV20NE3它仍然有它的子项,它们被添加并显示,但它们的类型更改为MovieClip,忽略基类。

+0

我不确定这是不是你的意思,但看看这个文件。我想这可能是你正在寻找的东西。 (如果它是我会张贴它作为答案)http://www.megaupload.com/?d=A1OPFZDO – Zevan 2010-12-19 23:10:52

+0

它是和不是,需要有多种类型的酒吧与基类酒吧,而不是一个。但是,将其改为以这种方式工作确实有效,这似乎是因为您选择在第1帧中导出它们。当然,这具有不必要的副作用,因为需要将所有类似资源导出到第1帧并使其更加困难对于preloader,但到目前为止,这是我得到的最好的选择。 – Lance 2010-12-19 23:20:47

+0

很酷...即使它的老式学校最可靠的预加载器类型是创建一个存根电影 - 也就是加载主电影的电影 - 这解决了第一个问题的导出问题。这看起来似乎有些骇人听闻,但考虑用其他方式做好预加载程序需要做多少工作,这是一个很小的代价。如果你是谷歌的AS3预加载器,你会明白我的意思,很多过分复杂的例子 - 并不是说​​它们不工作,只是说它们对于一个简单的预加载器来说很多工作。 – Zevan 2010-12-19 23:24:24

回答

1

问题出在你声明Foo的类成员。如果您希望Flash将元素实例化为除MovieClip或Sprite之外的其他元素,则必须向该类正确添加成员声明,​​或者在使用new关键字时声明该类型。

这工作:

package { 
import flash.display.MovieClip; 
import flash.utils.describeType; 

public class Foo extends MovieClip { 
    public var bar1:Bar1; 
    public var bar2:Bar2; 
    public var bar3:Bar1; 
    public var bar4:Bar2; 

    public function Foo() { 
     trace("foo", this.numChildren); 

    } 
} 
} 

你也可以设置ActionScript首选“自动声明舞台实例”,并省略类的声明,如果你的类并没有真正做什么特别的事情。

ActionScript对类型非常宽容,但似乎编译器忽略面板中声明的类型,直到它在代码中找到某种引用为止,可能防止二进制文件意外膨胀,如果有人忘记删除类名在图书馆的某处。

+0

这也有效,希望避免它,因为它有很多乏味,但我可以做到以上直到最终构建,然后在类中手动声明所有对象。感谢这两个! – Lance 2010-12-20 02:58:53