0

こんにちは私は、ステージ上の位置を制御するSpriteを拡張するカスタムクラスを持っています。ステージを管理するクラスが、ステージに追加されたスプライトを取得してカスタムクラスタイプに変換できるようにします。つまり、管理クラスがネイティブスプライトを適切に配置できるようにラップします。次のようなことが可能かどうか誰かが知っていますか

var managed:managedSprite = new managedSprite(nativeSprite);

managedSpriteはSpriteクラスを拡張しますか?すでにSpriteを拡張しているmanagedSpriteに関連するオーバーヘッドを防ぐために、可能な限りスプライトへの参照を合成する必要はありません。

とにかくリフレクション(おそらくcommons.reflectionライブラリ)を使用していますか?

ありがとう

4

2 に答える 2

0

'Decorator'パターンを使用することをお勧めします。

一見すると少し複雑に見えますが、理解して使用するのは非常に簡単です。 http://www.as3dp.com/2009/04/actionscript-30-easy-and-practical-decorator-design-pattern/

于 2012-05-14T15:16:17.923 に答える
0

イベントリスナーをステージに追加し、を使用Event.ADDEDして、ディスプレイリストの任意の場所に追加された任意のディスプレイオブジェクトへの参照を取得できます。

ManagedSprite次に、追加されたアイテムが(BTW、慣例ではクラス名を大文字で始める)のサブクラスである場合は、単に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 に答える