Flash AS3 - Получение списка Объектов библиотеки?

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

Спасибо.

7
задан Scott 5 February 2010 в 22:49
поделиться

4 ответа

Не во время выполнения, нет. Однако вы можете управлять объектами библиотеки с помощью JSFL в среде IDE: http://livedocs.adobe.com/flash/9.0/main/flash_cs3_exnding.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 () .

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

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

1
ответ дан 7 December 2019 в 14:32
поделиться

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

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

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 () или flash.utils.getDefinition () . Кроме того, он копирует отслеженное сообщение в буфер обмена. Если вы сохраните JSFL в папке Commands , вы можете установить сочетание клавиш для некоторой скорости.

HTH, Джордж

1
ответ дан 7 December 2019 в 14:32
поделиться

В основном, Нет ... При экспорте в 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
ответ дан 7 December 2019 в 14:32
поделиться

«Проблематично» - это не то слово, которое я бы использовал для описания работы с потоками. «Утомительный» - более подходящее описание.

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

Что касается конкретных опций многопоточности в C #, вот несколько предложений о том, когда использовать каждую из них.

  • Используйте BackgroundWorker , если имеется одна задача, выполняемая в фоновом режиме и требующая взаимодействия с пользовательским интерфейсом. Задача передачи данных и вызовов методов в поток пользовательского интерфейса обрабатывается автоматически через его модель на основе событий. Избегайте BackgroundWorker, если (1) сборка еще не ссылается на сборку System.Windows.Form, (2) необходимо, чтобы поток был передним, или (3) необходимо управлять приоритетом потока.
  • Если требуется эффективность, используйте поток ThreadPool . ThreadPool помогает избежать накладных расходов, связанных с созданием, запуском и остановкой потоков. Избегайте использования ThreadPool, если (1) задача выполняется в течение срока действия приложения, (2) необходимо, чтобы поток был потоком переднего плана, (3) необходимо управлять приоритетом потока или (4) необходимо, чтобы поток имел фиксированный идентификатор (прерывание, приостановка, обнаружение).
  • Используйте класс Thread для выполнения длительных задач и в тех случаях, когда требуются функции, предлагаемые формальной моделью многопоточности, например, выбор между передним и фоновым потоками, изменение приоритета потока, точное управление выполнением потока и т. д.
-121--4631773-

В Access, вероятно, вы найдете соединение быстрее, если ваши таблицы не

SELECT DISTINCT Table1.Column1
FROM Table1 
LEFT JOIN Table2
ON Table1.Column1 = Table2.Column1  
WHERE Table2.Column1 Is Null

Это исключит из списка все записи с совпадением в Table2.

-121--3107628-

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

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

Поэтому я дал Location конструктор так:

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

    d.addLocation(this);
}

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

0
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: