0

嗨,我有一个扩展 Sprite 的自定义类,它控制舞台上的定位。我希望管理舞台的类能够获取添加到舞台的任何精灵并将其转换为自定义类类型,即包装它,以便管理类可以相应地定位本机精灵。有谁知道是否可以执行以下操作

var managed:managedSprite = new managedSprite(nativeSprite);

managedSprite 在哪里扩展了 Sprite 类?如果可能的话,我不想合成对 sprite 的引用,以防止与已扩展 Sprite 的 managedSprite 相关的开销。

无论如何使用反射(也许是 commons.reflection 库)?

谢谢

4

2 回答 2

0

您可能想要使用“装饰器”模式。

乍一看似乎有点复杂,但它很容易理解和使用。 http://www.as3dp.com/2009/04/actionscript-30-easy-and-practical-decorator-design-pattern/

于 2012-05-14T15:16:17.923 回答
0

您可以将事件侦听器添加到舞台并用于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!
}
于 2012-05-14T15:25:24.663 回答