JSFL экспортирует "направляющие" анимации - PullRequest
0 голосов
/ 18 декабря 2011

Мне нужно преобразовать анимацию временной шкалы в FLA в код AS3 (возможно, через XML).Проблема в том, что буквально сотни слоев и тысячи кадров.

Хотя я понимаю структуру JSFL, я не могу найти "направляющие" анимации, зацикливаясь на временной шкале -> слой-> кадр.Использование curFrame.isMotionObject () всегда ложно.

Вот пример того, что я пытаюсь сделать:

/* Gets all motions in all motion objects and exports to a file. */
fl.outputPanel.clear();

//store max layers/frames
var fcnt = fl.getDocumentDOM().getTimeline().frameCount;
var lcnt = fl.getDocumentDOM().getTimeline().layerCount;
fl.trace( "fl.getDocumentDOM().getTimeline().frameCount = " + fcnt );
fl.trace( "fl.getDocumentDOM().getTimeline().layerCount = " + lcnt );

//store pre-run layers/frames:
var origFr = fl.getDocumentDOM().getTimeline().currentFrame;
var origLyr = fl.getDocumentDOM().getTimeline().currentLayer;
fl.trace( "fl.getDocumentDOM().getTimeline().currentFrame = " + origFr );
fl.trace( "fl.getDocumentDOM().getTimeline().currentLayer = " + origLyr );

var totout = 0;
var curFrm;
var curl = origLyr;
var curf = origFr; 
var outstr = "";

for (curf = 0; curf < fcnt; curf++)
{
    // have the IDE go into the current frame:
    fl.getDocumentDOM().getTimeline().currentFrame = curf;

    // removed to test one layer only
    //for (curl = 0; curl < lcnt; curl = lcnt) // curl++) // curl = lcnt)
    //{

        // have the IDE go into the current layer:
        fl.getDocumentDOM().getTimeline().currentLayer = curl;

        if(curf > fl.getDocumentDOM().getTimeline().layers[curl].frames.length)
            break;

        curFrm = fl.getDocumentDOM().getTimeline().layers[curl].frames[curf];

        //this is always false. . . why?
        if (
            curFrm.isMotionObject() 
            //&& curFrm.hasMotionPath()
        ){
            totout++;
            //curFrm.selectMotionPath(true);
        }
        else{
            outstr += "There is no motion path\n";
        }

        //for testing:
        break;
    //}
    //for testing:
    //break;
}

//reset layers/frames back to pre-run status:
fl.getDocumentDOM().getTimeline().currentFrame = origFr;
fl.getDocumentDOM().getTimeline().currentLayer = origLyr;

fl.trace(outstr);
fl.trace("totout = " + totout);

1 Ответ

1 голос
/ 19 декабря 2011

Вы можете использовать команду Export Motion XML, которую вы можете вызвать из jsfl через:

fl.runScript(fl.configURI + 'Javascript/MotionXML.jsfl', 'exportMotionXML');

Насколько я помню, формат Classic Tween XML отличается от формата Motion Tween XML . Функции Motion XML довольно удобны и используются недостаточно. Вы также можете использовать copyMotionXML и обрабатывать XML в JSFL, поскольку механизм JS поддерживает E4X .

В качестве альтернативы, если вас устраивают классы Animator / AnimatorFactory из пакета fl.motion , вы можете сделать это:

fl.runScript(fl.configURI + 'Javascript/MotionXML.jsfl', 'copyMotionAsAS3');

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

Я немного использовал функцию MotionXML на работе для сайта AudiA8 мы сделали так, как нам нужно было сопоставить некоторую интерактивность с некоторыми красивыми рендерами из Mill , и я написал импортер для ключевых кадров Mocha во временную шкалу Flash с использованием этой функции.

...