Как получить доступ к членам группы в Flash CS3 - PullRequest
2 голосов
/ 23 марта 2009

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

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

Ссылка CS4 определяет свойство members для объекта Group.

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

Ответы [ 4 ]

1 голос
/ 17 июня 2009

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

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();
    }
}
1 голос
/ 14 апреля 2009

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

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

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

0 голосов
/ 16 апреля 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());
}
0 голосов
/ 08 апреля 2009

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

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

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

...