Получить экземпляры по имени класса в AS3 - PullRequest
0 голосов
/ 17 сентября 2011

Мне нужно получить все экземпляры на моей стадии в соответствии с определенным именем класса. Я делаю это:

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');
    }
}

Но я хочу лучшего способа (более эффективно, без проверки всех MC). Возможно ли это?

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Если вы можете начать отслеживание экземпляров с самого начала своей жизни приложения, я бы рекомендовал просто добавить прослушиватель событий:

// 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 голосов
/ 17 сентября 2011

Вы можете хранить список всех MC определенного типа, расширяя класс контейнера и переопределяя его функции addChild(), addChildAt(), removeChild() и removeChildAt().

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.

...