Получить все именованные экземпляры во флэш-фильме - PullRequest
0 голосов
/ 18 ноября 2008

Можно ли получить список всех экземпляров с именем во флэш-фильме, используя actionScript 2. Как массив, содержащий все именованные текстовые области или все экземпляры movieClip и т. Д. или удалите текстовые области и т. д., и ActionScript может их динамически найти и получить тексты из отдельного источника данных.

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

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

Ответы [ 3 ]

2 голосов
/ 23 ноября 2008

@ Stein Gauslaa Strindhaug

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

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).

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

1 голос
/ 19 ноября 2008

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

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

0 голосов
/ 18 ноября 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!

...