アニメーションのタイムラインを指定倍するjsfl

なんか必要に迫られて作ってみた。

_rootタイムラインと、ライブラリ内のグラフィック、ムービークリップシンボルのタイムラインを全て指定倍するユーティリティです。

トゥイーンの最後のフレームを伸ばしたくないと思って、その1つ前のフレームを伸ばすようにした。
でも、それだとグラフィックシンボルにてシングルフレームの開始フレームというワザを使っているとアニメーションが同期しなくなる可能性がある。
(そんなワザ使うんだね。。。意外とタイムラインのワザっていろいろありますよね。。。同期を切り替えたりとか。。。)

なので設定にて単純にキーフレームの終わりの部分を延ばすか、前のフレームを伸ばしてトゥイーン自体の長さを変えれるようにしてみた。

初めて作ったので、ちょっと効率悪いかも。というか、動作遅すぎ。。。と思ってフレームをなめ回すんじゃなくて、frame.duration を使ったらギザ早くなった。(当社比 100倍)
フレームとかレイヤーの移動の処理は時間がかかるのかな。

ダウンロード

修正) 2007.08.28 15:20 ルート以外のタイムラインを開いていたときルートが指定倍されず、開いているタイムラインが2度指定倍される不具合の解消
/**
* ステージのタイムラインと全てのシンボルのタイムラインを指定倍する。(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;
		}
	}
}


contributor nao : 2007年08月22日 04:03

comment