您可以将事件侦听器添加到舞台并用于Event.ADDED
获取对添加到显示列表中任何位置的任何显示对象的引用。
如果添加的项目是ManagedSprite
(顺便说一句,约定是以大写字母开头的类名),则只需键入 cast:
stage.addEventListener (Event.ADDED, onAdded);
function onAdded( ev:Event ):void {
if (ev.target is ManagedSprite) {
var managed:ManagedSprite = ManagedSprite( ev.target );
doStuffWith( managed );
}
}
编辑
我想我只是理解了您的问题:您不是在尝试进行实际的类型转换-这需要您已经设置了类层次结构,即您必须已经扩展了 ManagedSprite 类-但是要添加功能运行!
我强烈劝阻你不要尝试做深拷贝等——这会严重影响性能,这取决于你要添加多少精灵,而且你将不再有你的编译器来帮助你防止错误。
相反,看看你是否不赞成组合而不是继承:为精灵创建一种“代理”类,我们称之为它ManagedSpriteProxy
,它实现了你在 ManagedSprite 上调用的所有方法,但将所有实际操作转发给它的 `managedSprite ' 财产。然后使用我上面概述的事件处理程序来创建代理对象并附加相应的精灵:
public class ManagedSpriteProxy {
private var _managedSprite:Sprite;
public function ManagedSpriteProxy( managedSprite:Sprite ) {
this.managedSprite = managedSprite;
}
public function get managedSprite():Sprite {
return _managedSprite;
}
public function set managedSprite( managedSprite : Sprite ):void {
_managedSprite = managedSprite;
setUpAnyHandlersOrWhatever();
}
private function setUpAnyHandlersOrWhatever():void {
// Many wonderful things happening
}
// Many more wonderful things happening via public API
}
// somewhere else
public class SpriteManager {
private var _managedSprites:Array = [];
public function SpriteManager() {
addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
}
private function onAddedToStage( ev:Event ):void {
removeEventListener( Event.ADDED_TO_STAGE );
stage.addEventListener( Event.ADDED, onAdded );
}
private function onAdded( ev:Event ):void {
if( ev.target is Sprite ) {
addWithProxy( ev.target as Sprite );
}
}
private function addWithProxy( sprite:Sprite ) : void {
var proxy:ManagedSpriteProxy = new ManagedSpriteProxy( sprite );
_managedSprites.push( proxy );
}
// Insert here whatever methods used to manage the sprites,
// all of them call the proxies instead of the sprites!
}