Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Автоперевестка таймлайна при смене fps (http://www.flasher.ru/forum/showthread.php?t=109335)

chingachgoog 12.03.2008 15:33

Автоперевестка таймлайна при смене fps
 
Например, когда мы эмбедим видео на таймлайн, то видео автоматически синхронизируется с таймлайном исходя из установленного fps.

Вопрос: можно ли как-то динамически переверстать таймлайн (растянуть/сжать простейшие анимации) при смене fps? Или каждый раз это необходимо делать руками?

Пример:
Есть флешка с fps=10 и 50-ью кадрами (1-й и 50-й - ключевые в анимации движения).
Если менять fps на 20, то анимация движения должна быть соответственно из 100 кадров (чтобы сохранить динамику анимации) и 50-й ключевой кадр должен стать 100-м.

iNils 12.03.2008 17:32

Написать JSFL скрипт, который будет переставлять ключевые кадры.

chingachgoog 12.03.2008 19:38

Что-то не могу найти, как получить тип фрейма (ключевой/не ключевой)?

iNils 12.03.2008 19:51

У frame есть свойство startFrame, которое показывает начальный фрейм для данной последовательности.
Код:

fl.outputPanel.clear ();
var frameArray = fl.getDocumentDOM().getTimeline().layers[0].frames;
var len = frameArray.length;
for (i = 0; i < len; i++) {
        if (i == fl.getDocumentDOM().getTimeline().layers[0].frames[i].startFrame) {
                fl.trace(i + " keyframe");
        } else {
                fl.trace(i);
        }
}

пример для однослойного fla

chingachgoog 12.03.2008 20:07

Понятно...
Я думал есть специальное свойство, а так я уже сделал нечто подобное
(для любого числа слоев):

Код:

fl.outputPanel.clear ();

myFile=fl.getDocumentDOM()
myTimeline=myFile.getTimeline()

for (i=0; i<myTimeline.layers.length; i++){
        curLayer=myTimeline.layers[i]
        myTimeline.setSelectedLayers(i)
       
        for (j=0; j<curLayer.frames.length; j++){
                curFrame=curLayer.frames[j]
                fl.trace(i+" "+j+" "+curFrame.duration+" "+curLayer.frames.length+" keyframe")
                j+=curFrame.duration-1       
        }
}

add:
А где математический аппарат? Мне, например надо округлять числа: из 2.8 сделать 3. Как?
add2: вроде нашел - все просто, как валенок: Math.round() :)

add3:
вроде вышло :)

Код:

// скрипт для автоформата таймлайна
// для случая когда fps учащается до значения myNewRate
// а динамику анимации надо сохранить

myFile=fl.getDocumentDOM()
myTimeline=myFile.getTimeline()

myNewRate=18 // здесь поставить значение желаемого fps
myOldRate=myFile.frameRate
myCoeffRate=myNewRate/myOldRate

for (i=0; i<myTimeline.layers.length; i++){
        curLayer=myTimeline.layers[i]
        myTimeline.setSelectedLayers(i)
        for (j=0; j<curLayer.frames.length; j++){
                curFrame=curLayer.frames[j]
                add=Math.round(curFrame.duration*myCoeffRate-curFrame.duration)
                myTimeline.insertFrames(add, false, j);
                j+=curFrame.duration-1
        }
}
myFile.frameRate=myNewRate


Andrew_J 23.06.2008 00:24

Прошу прощения за тупой вопрос, но куда этот код вставлять чтобы работало?

iNils 23.06.2008 00:58

Сохранить в файле с расширением jsfl. Потом в меню выберите Commands > Run command... и этот файл.
Либо скачайте модуль CommandPromt, позволяющий запускать jsfl в панели ide

chingachgoog 23.06.2008 19:10

чуток потом придется руками подправить, если было много кейфреймов разной длины.

andrey_x 02.05.2012 13:50

Нужно было решить аналогичную задачу, только в обратную сторону - уменьшение FPS, т.е. "сжатие таймлайна". Немного дописал код, может кому пригодится:

Код AS1/AS2:

fl.outputPanel.clear ();
// скрипт для автоформата таймлайна
// для случая когда fps изменяется, а динамику надо сохранить
 
myFile = fl.getDocumentDOM();
myTimeline = myFile.getTimeline();
 
var newFPS= prompt("new FPS:");
myNewRate = (newFPS==null) ? myFile.frameRate : parseInt(newFPS);
 
myOldRate = myFile.frameRate;
myCoeffRate = myNewRate/myOldRate;
 
var addCoef;
 
for (i = 0; i < myTimeline.layers.length; i++){
        curLayer = myTimeline.layers[i];
        myTimeline.setSelectedLayers(i);
        for (j = 0; j < curLayer.frames.length; j++){
                curFrame = curLayer.frames[j];
                if(curFrame.duration==1) continue;
 
                if(myCoeffRate > 1) {
                        addCoef = curFrame.startFrame==0 ? 1 : 0;                // если первый кадр - то добавляем 1 иначе нет
                        addFr = Math.round(curFrame.duration * myCoeffRate - curFrame.duration) +addCoef;
                        myTimeline.insertFrames(addFr, false, j);
                        j += curFrame.duration - 1;
                } else if(myCoeffRate<1) {
                        remFr = Math.round(curFrame.duration - curFrame.duration * myCoeffRate);
                        myTimeline.removeFrames(curFrame.startFrame, curFrame.startFrame+remFr);
                        j += curFrame.duration + 0;
                }               
        }
}
if (myCoeffRate!=1) myFile.frameRate = myNewRate;



Часовой пояс GMT +4, время: 01:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.