Flash AS3 - получение списка объектов библиотеки? - PullRequest
7 голосов
/ 06 февраля 2010

Есть ли способ получить доступ или просмотреть список всех объектов, экспортированных в ActionScript из Flash IDE? Я пытаюсь избавить себя от хлопот, просто перебирая выбранные MC и обрабатывая их определенным образом, не зная их имен.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 01 июня 2011

Я использую описанный здесь SwfClassExplorer: http://flassari.is/2008/07/swf-class-explorer-for-as3/

1 голос
/ 07 февраля 2010

Этот вопрос чем-то похож на этот .

Это JSFL, который вам нужен, чтобы перечислить только мувиклипы, которые экспортируются в actioncript:

var doc = fl.getDocumentDOM();
var libItems = doc.library.items;
var libItemsNum = libItems.length;
var classesString = 'var '+doc.name.substr(0,doc.name.length-4)+'Classes = [';
var classesNum = 0;
var classes = [];

fl.outputPanel.clear();
for(var i = 0 ; i < libItemsNum; i++){
 if(libItems[i].linkageExportForAS){
  classes[classesNum] = libItems[i].linkageClassName;
  classesNum++;
 }  
}
for(i = 0; i < classesNum; i++){
 if(i < classesNum-1) classesString += '"'+classes[i]+'",';
 else      classesString += '"'+classes[i]+'"];';
}
fl.clipCopyString(classesString);
fl.trace(classesString);

Он отслеживает имя экспортируемых классов как массив строк, поэтому вы можете использовать его с getDefinitionByName () * ApplicationDomain *) 1009 * или flash.utils.getDefinition () . Кроме того, он копирует отслеженное сообщение в буфер обмена. Если вы сохраните JSFL в папке Commands , вы можете установить комбинацию клавиш на небольшую скорость.

НТН, George

1 голос
/ 07 февраля 2010

Не во время выполнения, нет. Вы можете манипулировать объектами библиотеки с помощью JSFL в IDE: http://livedocs.adobe.com/flash/9.0/main/flash_cs3_extending.pdf. Не уверен, поможет ли это вообще, но, возможно, вы можете сгенерировать код для использования в приложении, проанализировав библиотеку каким-либо образом.

var lib = fl.getDocumentDOM().library;
for (var i = 0; i < lib.items.length; i++)
{
    var item = lib[0];
    fl.trace(item.name + " " + item.getItemType());
}

Возможно, сгенерировать некоторый код на основе библиотечных объектов 'getItemProperty() или getItemType().

Кроме этого, я думаю, что вам лучше всего поступить так, как сказали другие. Создайте фиктивный мувиклип, в котором каждый элемент находится внутри, и спрячьте его за сценой. Добавьте слушатель для «добавлен на сцену» на нем и выполните цикл по его дочерним элементам и используйте «отражение» getQualifiedClassName для выполнения действий, основанных на его классе, или просто используйте имя экземпляра и оператор switch.

И наконец, что именно вы «обрабатываете» для каждого из этих мувиклипов? Возможно, это скорее проблема дизайна, и все они должны расширить общий подкласс MovieClip, к которому добавлен обработчик «добавлен на сцену», где вы смотрите на тип MovieClip, который добавляется в ваше приложение, и выполняете некоторые действия в этом одиночная функция. Сейчас я работаю над работой по локализации, и именно так мы обрабатываем несколько разных клипов во время выполнения.

0 голосов
/ 07 февраля 2010

По существу, Нет ... Когда вы экспортируете в ActionScript в библиотеке, он становится классом.То же, что и другие классы - MovieClip, Loader ... и т. Д.это все свойства времени компиляции.По сути, невозможно найти эти классы во время выполнения.

Но вы упомянули итерацию по MC и что-то с ними сделали.Если вам нужно что-то сделать с MC, уже находящимися на сцене, в зависимости от их класса, вы можете сделать это с помощью следующего:

for (var i=0; i<this.numChildren; i++){
    trace("Movie Name: "+this.getChildAt(i).name);
    trace("Movie Class: "+getQualifiedClassName(this.getChildAt(i)));
}

Используя вышеуказанный цикл и getQualifiedClassName может быть альтернативойрешение.

0 голосов
/ 06 февраля 2010

У меня была похожая проблема, и мне было бы интересно ее решение, если есть. Однако в итоге я заставил конструктор каждого элемента найти класс документа (вызывая this.parent до тех пор, пока он не найдет тот, который относится к нужному классу), а затем вызывая функцию этого класса документа.

Я пытался сообщить в Игру информацию о локациях, которые я разместил в IDE.

Итак, я дал Location такой конструктор:

public function Location(){
    var d:DisplayObject = parent;
    while(!(d is Game)){
       d = d.parent
    }

    d.addLocation(this);
}

Затем в классе Game я смог добавить их в массив и перебрать их. Я уверен, что это не лучший способ сделать это, но это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...