イベントリスナーをステージに追加し、を使用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!
}