2011-09-17 15 views
0

私のステージ内のすべてのインスタンスを特定のクラス名に従って取得する必要があります。 (すべてのMCをチェックせずに、より効率的に)AS3のクラス名でインスタンスを取得

var class_ref:Class = getDefinitionByName('fran.MyOwnClass') as Class; 
var element; 

for (var i:uint = 0; i < this.parent.numChildren; i++) 
{ 
    element = this.parent.getChildAt(i); 
    if (element is class_ref) 
    { 
     trace('Found element of class fran.MyOwnClass'); 
    } 
} 

しかし、私はより良い方法をしたい:私はこれをやっています。出来ますか?

+0

私はそれが正しいクラスかどうかをチェックする他の方法を考えることができますが、私はあなたがループを回避できるとは思わない。おそらく、コンテナの 'addChild()'をオーバーライドすれば、そこにチェックを入れることができますか? – RIAstar

+0

@RIAstarオーバーライドは、要素を見つけたときに以下のことをチェックして要素を見つけ出す必要があるため、必要なものではありません。または、私があなたが言ったことを理解できませんでした(私はすでにAS3で非常に初心者です)。 –

答えて

1

をお勧めします:

// in document class constructor, before doing anything else 
stage.addEventListener(Event.ADDED, stage_addedHandler); 
stage.addEventListener(Event.REMOVED, stage_removedHandler); 

private function stage_addedHandler(event:Event):void 
{ 
    var obj:DisplayObject = event.target as DisplayObject; 
    // do something, e.g. if (obj is MyClass) objCounter++; 
} 
... 

「あなたが可能であればあなたはループを回避することはできません。もっと最適化してください。

var n:int = container.numChildren; 
while (n-- > 0) 
{ 
    ... 
} 

どこでもaddChild()などをオーバーライドしてください。これは実際のプロジェクトでは不可能な解決策です。

+0

あなたは絶対に正しいです。私の心はどこですか? – RIAstar

0

あなたは、コンテナクラスを拡張し、その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]

関連する問題