あなたは、コンテナクラスを拡張し、そのaddChild()
、addChildAt()
、removeChild()
とremoveChildAt()
機能をオーバーライドすることによって、すべてのMCの特定の種類のリストを保つことができます。このクラスを使用して
public class MySprite extends Sprite {
public var ownClasses:Vector.<MyOwnClass> = new Vector.<MyOwnClass>();
override public function addChild(child:DisplayObject):DisplayObject {
addOwnClass(child as MyOwnClass);
return super.addChild(child);
}
override public function addChildAt(child:DisplayObject, index:int):DisplayObject {
addOwnClass(child as MyOwnClass);
return super.addChildAt(child, index);
}
private function addOwnClass(child:MyOwnClass):void {
if (child) ownClasses.push(child);
}
override public function removeChild(child:DisplayObject):DisplayObject {
removeOwnClass(child as MyOwnClass);
return super.removeChild(child);
}
override public function removeChildAt(index:int):DisplayObject {
removeOwnClass(getChildAt(index) as MyOwnClass);
return super.removeChildAt(index);
}
private function removeOwnClass(child:MyOwnClass):void {
if (child) {
var i:int = ownClasses.indexOf(child);
if (i != -1) ownClasses.splice(i, 1);
}
}
}
、子が追加されるたびに、あなたはそれがMyOwnClass
だかどうかを確認し、それはあなたがownClasses
リストに追加されます。子供を取り除くのと同様です。
これで、MCをループせずに必要なときにリストにアクセスできます。
public class Main extends MySprite
{
public function Main()
{
addChild(new Sprite());
addChild(new MyOwnClass());
trace(ownClasses);
}
}
あなたはあなたのアプリケーションの人生の非常に最初からインスタンスを追跡を開始することができた場合、私は単純にイベントリスナーを追加します。この意志出力[object MyOwnClass]
私はそれが正しいクラスかどうかをチェックする他の方法を考えることができますが、私はあなたがループを回避できるとは思わない。おそらく、コンテナの 'addChild()'をオーバーライドすれば、そこにチェックを入れることができますか? – RIAstar
@RIAstarオーバーライドは、要素を見つけたときに以下のことをチェックして要素を見つけ出す必要があるため、必要なものではありません。または、私があなたが言ったことを理解できませんでした(私はすでにAS3で非常に初心者です)。 –