Получить все именованные экземпляры во флэш-ролике

Можно ли получить список всех экземпляров с именем во флэш-ролике с помощью сценария действия 2. Например, массив, содержащий все именованные текстовые области или все экземпляры MovieClip и т. д. Я хотел бы получить это, чтобы дизайнер мог добавлять или удалять текст области и т. д., и скрипт действий может динамически находить их и получать тексты из отдельного источника данных.

Я думаю, что мне нужно что-то вроде дерева DOM или, что еще лучше, что-то вроде того, как getElementByName() работает в JavaScript. И также получить строковое значение имени экземпляра, чтобы я мог найти его текстовое значение в xml.

Допустим, дизайнер добавляет новую текстовую область с именем «авторское право», и мой код должен (без изменения сценария) найти данные с идентификатором «авторское право» в файле XML, если он там есть, и добавить значение в область текста.


person Stein G. Strindhaug    schedule 18.11.2008    source источник
comment
Я до сих пор ничего не могу найти, по крайней мере, этот вопрос теперь является лучшим результатом поиска в Google для получения всех экземпляров flash и т. д.   -  person Stein G. Strindhaug    schedule 18.11.2008


Ответы (3)


@Стейн Гауслаа Стриндхауг

Это довольно грубо, но должно сработать!

private function traceAllChildren(rootContainer:DisplayObjectContainer):void {
    for(var i=0; i < rootContainer.numChildren; i++) {
        var item:* = rootContainer.getChildAt(i);
        try {
            traceAllChildren(item);
        } catch (e:Error) {
            trace(e.toString());
        }
        trace(item.toString());
        // This is the block where you can affect
        // an 'item' depending on it's type, name, etc..
        // eg: 
        //      if (item.toString() == '[object TextField]') {
        //          item.text = "The text I want to insert";
        //      }
        // or
        //      if (item.name == myTextFieldNameVar) {
        //          item.text = "The text I want to insert";
        //      }
    }
}

Затем назовите его так: traceAllChildren(this) или traceAllChildren(myParentMovieClip).

Я надеюсь, что это поможет, удачи!

person defmeta    schedule 23.11.2008
comment
Спасибо! Это прекрасно работает. Может быть, немного грязно пытаться разобрать все элементы, но я не заметил никакой медлительности. - person Stein G. Strindhaug; 26.11.2008

Краткий ответ: нет «встроенного» способа сделать это. Вы можете попытаться найти функциональность, аналогичную getElementByName(), но для этого потребуется начать с _root и просмотреть содержимое — и, строго говоря, муви-клип начинается со ссылок на его дочерние элементы, но они могут быть удалены во время выполнения, так что это может потерпеть поражение.

С учетом сказанного, это общая проблема, и существует множество подходов к ней. Одна вещь, которую вы можете найти более полезной, - это создать пользовательский компонент, прикрепленный к пользовательскому классу, скажем, «TextPlaceholder», и пусть ваш дизайнер поместит его копии там, где им нужен динамический текст. Затем во время выполнения этот компонент может проверить свое свойство _name или другие настраиваемые параметры компонента и на их основе создать текстовое поле соответствующего размера, содержимого и т. д. Это всего лишь один из способов приблизиться к этому.

person fenomas    schedule 19.11.2008

Прошло некоторое время с тех пор, как я кодировал AS2, но, возможно, вы могли бы использовать комбинацию MovieClip.getInstanceAtDepth() и this.getNextHighestDepth(), чтобы найти самую высокую глубину в вашем фильме, а затем проследить каждую более низкую глубину, пока не найдете getInstanceAtDepth( ), который соответствует клипу, который вы хотите заполнить новыми данными.

Я также заметил этот пример кода в документации AS2.

Следующий код отслеживает глубину всех экземпляров фрагмента ролика в рабочей области:

for (var i in this) {
    if (typeof (this[i]) == "movieclip") {
    trace("movie clip '"+this[i]._name+"' is at depth "+this[i].getDepth());
    }
}

PS: Я знаю, что вы, вероятно, не хотите это слышать, но в AS3 это пустяк, так как вы можете просто перебирать this.children!

person defmeta    schedule 18.11.2008
comment
Элементам, размещенным во время создания, присваивается отрицательная глубина, и невозможно получить минимальную глубину. Поэтому, чтобы быть уверенным в повторении всего содержимого, вам нужно перейти от getNextHighestDepth() к -MAXINT. - person fenomas; 19.11.2008
comment
Мне удалось преобразовать большую часть моего кода в AS3, не могли бы вы объяснить, как это сделать в AS3? - person Stein G. Strindhaug; 23.11.2008