Как получить доступ к членам группы в Flash CS3

Я пишу скрипт для доступа ко всем динамическим текстовым полям в библиотеке файла flash (fla) и встраивания определенных наборов символов.

Я перебираю все объекты в поисках текстовых полей, но, похоже, возникают некоторые проблемы при попытке доступа к членам группового объекта. У него есть дочерние элементы во флэш-файле, но я не вижу способа получить к ним доступ из объекта Group, определенного в справочник по CS3 для jsfl. Среди прочего у группы есть недокументированное свойство layer, но, похоже, оно содержит только ссылку на себя.

ссылка CS4 определяет членов. em> для объекта Group.

Итак, мои вопросы: как получить доступ к дочерним элементам объекта Group в API сценария jsfl Flash C3?


person BefittingTheorem    schedule 23.03.2009    source источник
comment
Извините, люди, я использовал форму вместо группы. Вопрос в том, как получить доступ к объекту Group :)   -  person BefittingTheorem    schedule 14.04.2009


Ответы (4)


Просто сначала разгруппируйте () фигуры. Затем вы можете запустить обычное преобразование «текста». Это не должно повредить документу, потому что группировка не имеет реальных технических последствий.

var doc = fl.getDocumentDOM();
var results = fl.findObjectInDocByType("shape", doc);
for (var i = 0; i < results.length; i++) 
{
    if ( results[i].obj.isGroup )
    {
        doc.selection = [results[i].obj];
        doc.unGroup();
    }
}
person Community    schedule 17.06.2009

Объекты Shape не имеют потомков. Так что, если вы столкнетесь с объектом Shape в своей рекурсии, то внутри него нет динамических текстовых полей (или флэш-объектов внутри него как дочерних, если на то пошло)

Вас может сбить с толку то, что вы думаете, что группировка объектов на сцене создает форму, а это не так. «Группы» объектов на сцене существуют только в интерфейсе редактирования flash для удобства редактирования и рабочего процесса. После публикации они фактически не группируются в swf/actionscript.

Что может быть еще более запутанным, так это то, что когда у вас есть несколько векторных элементов на сцене или даже в некоторых ситуациях растровые элементы на сцене, Flash просто упростит их, сведя к одному объекту Shape. Это усиливает иллюзию того, что группировка объектов создает объект Shape, каждый из которых является дочерним, и, следовательно, объект Shape может иметь дочерние элементы, но на самом деле все, что он делал, это сглаживал все это в одну единственную форму с этой плоской графикой, нарисованной на нем. он не содержит ни одного из них как отдельных объектов. И такая ситуация никогда не случается с динамическим текстовым полем, так что если вы наткнулись на объект Shape, то там нет динамического текстового поля, идите дальше :)

person Bryan Grezeszak    schedule 14.04.2009

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

Shape не расширяет DisplayObjectContainer, поэтому я почти уверен, что у него не может быть дочерних объектов отображения, таких как, например, Sprite или MovieClip.

Вы должны быть в безопасности, пропустив их, если ищете TextFields.

person Alex Jillard    schedule 08.04.2009
comment
Плохо, это должны были быть группы - person BefittingTheorem; 10.04.2009

Вы уже сами намекнули на ответ: используйте свойство Members для объектов формы. Он возвращает массив объектов, содержащихся внутри, которые могут быть или не быть текстовыми объектами.

Вы не указали, используете ли вы fl.findObjectInDocByType() для сканирования документа в поисках текстовых объектов и фигур (потенциальных групп), но это тоже было бы неплохо.

http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00004151.html

Я полагаю, что следующий сценарий будет отслеживать текстовое значение всех динамических текстовых полей в FLA, если только я не упустил какой-нибудь неприятный вложенный случай. В любом случае, мы надеемся, что это поможет вам двигаться вперед. Имейте в виду, что вам нужно запускать скрипт из меню «Команды», чтобы функция fl.findObjectInDocByType() не выдавала ошибку. Смотрите комментарии по ссылке выше для получения дополнительной информации.

// Look for text objects
var doc = fl.getDocumentDOM();
var typeToSearchFor = "text";
var results = fl.findObjectInDocByType(typeToSearchFor, doc);

for(var i = 0; i < results.length; i++)
{
    if(results[i].obj.textType == "dynamic")
    {
        doWhatever(results[i].obj);
    }
}

// Look for shapes
typeToSearchFor = "shape";
results = fl.findObjectInDocByType(typeToSearchFor, doc);

var textObjects;

for(var i = 0; i < results.length; i++)
{
    var members = results[i].obj.members;

    for(var j = 0; j < members.length; j++)
    {
        if(members[j].elementType == "text" && members[j].textType == "dynamic")
        {
            doWhatever(members[j]);
        }
    }
}


function doWhatever(textObj)
{
    fl.trace(textObj.getTextString());
}
person Stiggler    schedule 16.04.2009
comment
Спасибо, Стигглер, этот метод findObjectInDocByType() будет удобным дополнением к моему набору инструментов :) Но этот код решает ту же проблему, что и у меня, я использую CS3, но класс Shape получил только свойство 'members' в CS4. - person BefittingTheorem; 16.04.2009
comment
О, я совершенно неправильно понял проблему! К счастью, решение простое — просто выложите несколько долларов за обновление :) - person Stiggler; 16.04.2009