用addElement()方法替代addChild()?

Posted on February 4, 2012

在Flex中,容器一律使用addElement(IVisualElement)系列方法替代原生的addChild(DisplayObject)系列方法来操作子对象,并且屏蔽了addChild()系列方法。目的是兼容非显示对象的添加和层级管理,比如绘图元素:GraphicElement。但是在游戏开发中,操作原生对象的机会还是比较多的,这时候就会出现addChild()和addElement()同时使用的情况,容易造成混乱。使用起来很不方便。所以一开始写框架的时候,我就计划这部分不照着flex写,还是通过在子类中覆盖addChild()系列方法,实现对子对象的操作统一操作。在只有UI组件的时候,一切都很顺利。

到了编写默认皮肤的时候,发现还是直接用flash catalyst导出的皮肤方便的多。但想要兼容flash catalyst导出的皮肤,就要实现一整套的带自动布局功能的绘图元素框架。我花了两天把flex里的绘图元素框架成功移植过来了。起初没考虑周全,认为使用一个显示对象作为绘图元素包装器就可以兼容绘图元素的添加和管理了。写的时候才发觉,flex的绘图元素是可以跟普通显示对象混排的。这样就不可能使用一个包装器就解决问题了,混排必然导致分层问题,这样多个绘图元素就没法公用一个显示对象了。现在要么跟flex一样,用addElement方法统一管理子对象,要么就把所有绘图元素都直接继承显示对象。两个我都不想,一时间就没招了。还在纠结中。。。期待有第三种方案。

后记:最终还是用了addElement方法,发现好处确实挺多的,并且同步解决了另一个性能问题,关于外部素材嵌入的,也可以无需重复嵌套显示对象了。