なんか必要に迫られて作ってみた。
_rootタイムラインと、ライブラリ内のグラフィック、ムービークリップシンボルのタイムラインを全て指定倍するユーティリティです。
トゥイーンの最後のフレームを伸ばしたくないと思って、その1つ前のフレームを伸ばすようにした。
でも、それだとグラフィックシンボルにてシングルフレームの開始フレームというワザを使っているとアニメーションが同期しなくなる可能性がある。
(そんなワザ使うんだね。。。意外とタイムラインのワザっていろいろありますよね。。。同期を切り替えたりとか。。。)
なので設定にて単純にキーフレームの終わりの部分を延ばすか、前のフレームを伸ばしてトゥイーン自体の長さを変えれるようにしてみた。
初めて作ったので、ちょっと効率悪いかも。というか、動作遅すぎ。。。と思ってフレームをなめ回すんじゃなくて、frame.duration を使ったらギザ早くなった。(当社比 100倍)
フレームとかレイヤーの移動の処理は時間がかかるのかな。
/**
* ステージのタイムラインと全てのシンボルのタイムラインを指定倍する。(1フレームのものは除く。)
*
* @param Number FRAME_STEP
* @param Boolean トゥイーンの場合最後のキーフレームを延ばすか(TRUE)
* 最後のフレームの前を延ばすかを変える。
* @description シーンには対応していません。
*/
/**
* 何倍に伸ばすかの設定値。
*/
var FRAME_STEP = Number(prompt('何倍にフレームを伸ばしますか?'));
/**
* トゥイーンの最後のフレームを伸ばすか、その前のフレームを伸ばすかの設定値。
*/
var TWEEN_END_ADJUST = !confirm("トゥイーンの最後のフレームを伸ばす。");
/**
* 全てシンボルのタイムラインを入力された値から増やす。
*
* @descritpion 制御しやすいように関数化。
*/
function execute() {
if (this.FRAME_STEP == 0) {
alert('入力された数値が正しくありません。処理を中断しました。')
return;
}
if (!confirm('処理を実行します。よろしいですか?')) return;
// ルートのタイムラインを開く
fl.getDocumentDOM().currentTimeline = 0
var arrSymbol = fl.getDocumentDOM().library.items;
// ルートタイムラインの拡張
this.extendFrame(fl.getDocumentDOM().getTimeline(), this.FRAME_STEP);
// シンボルを数え上げ
for (var i in arrSymbol) {
var currentSymbol = arrSymbol[i];
if (currentSymbol.itemType != 'graphic' && currentSymbol.itemType != 'movie clip')
continue;
fl.trace('[ ' + currentSymbol.name + ' ](' + currentSymbol.itemType + ') を処理しています。');
this.extendFrame(currentSymbol.timeline, this.FRAME_STEP);
}
alert('完了しました。');
} // なぜか定義とともに実行できない
execute();
/**
* 指定のタイムラインを指定の倍数で延ばす。
*
* @param TimeLine currentTimeline
* @param Number multiNum
*/
function extendFrame(currentTimeline, multiNum) {
if (currentTimeline.frameCount == 1)
return;
// レイヤーを数え上げ
for (var i = 0; i < currentTimeline.layers.length; i++) {
var currentLayer = currentTimeline.layers[i];
var targetTotalFrames = currentLayer.frames.length * multiNum;
var prevTweenType;
var currentFrame;
currentTimeline.currentLayer = i;
// フレームを数え上げ
for (var j = 0; j < targetTotalFrames; j += currentFrame.duration) {
currentFrame = currentLayer.frames[j];
currentTimeline.currentFrame = j;
// トゥイーンの際に、最後のキーフレームを延ばすかトゥイーン自体を延ばすかの場合わけ
if (this.TWEEN_END_ADJUST && (prevTweenType == 'motion' || prevTweenType == 'shape')) {
currentTimeline.insertFrames(currentFrame.duration * (multiNum - 1), false, j - 1);
j += multiNum - 1;
}
else {
currentTimeline.insertFrames(currentFrame.duration * (multiNum - 1), false, j);
}
// インスタンスのグラフィックシンボルのものの開始フレームを指定倍数増やす
for (var k = 0; k < currentFrame.elements.length; k++) {
var element = currentFrame.elements[k];
// 前のフレームが存在し、キーフレームかつグラフィックシンボルである場合
if ((element.symbolType == 'graphic') && (element.loop == 'single frame' || !currentLayer.motionTweenSync))
element.firstFrame *= multiNum;
}
if (currentFrame == null)
prevTweenType = null;
else
prevTweenType = currentFrame.tweenType;
}
}
}