階段状にフレームを挿入するjsflコマンド

2008.09.04 08:45twitter hatena

20080904.jpg

多数のモーションのタイミングを調整するときに、F5キーと格闘する必要性はもうありません。「階段状にフレームを挿入する」コマンド”FrameIntoFunction”リリースです。なんつってなんつって。

FrameIntoFunction.zip

効果は図の通りですが、作ってみて思いのほか用途の広いコマンドです。少なくとも、私にとっては。

以下使い方、使用例、ソースの順に紹介いたします。

インストール方法はjsflとxmlをcommandsフォルダに放り込むだけ。フォルダに関しては「jsflのすすめ」後半参照。放り込むと、Flashの上メニューの「コマンド」一覧に現れます。使用条件は「縦一列に1フレームを選択していること」です。複数レイヤーにまたがってないと意味を成しません。

階段の形式は、上向き・下向き、幅の一段指定・全体指定・ランダムモードが選べます。また、フレーム挿入の直前まで少数精度で計算を行ってますので、例えば「1.5フレームずつ」と指定すると2f, 1f, 2f…と挿入することが可能です。

補足ですが、このコマンドと特に相性のよいのが、Flashデフォルトに搭載されている「レイヤーに配分」という機能。特にテキストとは相性抜群です。「Takt」のタイポグラフィでは、このコマンドをフル活用しています。

使用例としてここに代表的なパターンをまとめたものを表示しておきます。
いずれもレイヤー配分とコマンドを使って、3~4ステップでできています。制作時間約15分。


参考までにFlaファイルも置いておきます。

最後にjsflのソースをのっけて終わり。エラーチェックとか実はとんでもなく適当です。

// ダイアログを開く
var insertStairlyDialog = fl.getDocumentDOM().xmlPanel(fl.configURI+"Commands/階段状にフレームを挿入.xml");

//OKボタンが押されたら
if (insertStairlyDialog.dismiss == "accept") {

	//ダイアログの入力情報を取得

	//間隔フレーム数。数データに変換。
	diff = Number(insertStairlyDialog.st_diff);

	//ずらし方
	how = insertStairlyDialog.st_how;

	//階段の上下
	order = insertStairlyDialog.st_order;

	//flashのタイムラインとかを扱うため変数に格納
	dom = fl.getDocumentDOM();
	tl = dom.getTimeline();

	//現在選択されているフレーム範囲を配列として取得
	selectedFrames = tl.getSelectedFrames();

	//縦一列じゃないと困るからエラーチェック。実はてきとー。
	if((selectedFrames[2] - selectedFrames[1]) != 1){
		alert('フレームの選択範囲を縦一列にして下さい');
	} 

	//ちゃんと縦一列を選んでいたら
	else {

		//選択フレーム範囲の縦の長さ=レイヤー数と、一番上が何枚目のレイヤーかを格納
		n = (selectedFrames.length / 3);
		sfhead = selectedFrames[0];

		//レイヤー数分の配列を用意して
		var diffarray = new Array(n);

		//入力条件にあわせて、i番目のレイヤーに何フレーム挿入するか配列内に計算しておく

		//「間隔ずつ」レイヤーをずらすなら
		if (how == 'layer'){
			//公差=間隔の単純な等差数列。上のレイヤーからだんだん挿入数が増える。
			if (order == 'goLow'){
				for (i = 0; i < n; i++){
					diffarray[i] = Math.round(diff * (i));
				}
			//上り階段のときは、下のレイヤーほど挿入数が減るから逆に。
			} else if (order == 'goHigh'){
				for (i = 0; i < n; i++){
					diffarray[i] = Math.round(diff * (n - i - 1));
				}
			}

		//「間隔」を全てのレイヤーで均等に配分するなら
		} else if (how =='total'){
			if (order == 'goLow'){
				//間隔をレイヤー数で割ったものが公差。代入直前で四捨五入して整数値に。
				for (i = 0; i < n; i++){
					diffarray[i] = Math.round(diff / n * i);
				}
			} else if (order == 'goHigh'){
				for (i = 0; i < n; i++){
					diffarray[i] =Math.round(diff / n * (n - i - 1));
				}
			}

		//「間隔」幅内でランダムにずらすなら
		} else if (how =='random'){
			for (i = 0; i < n; i++){
				diffarray[i] = Math.round(Math.random() * diff);
			}
		}

		//配列が用意できたので、i番目のレイヤーに配列のi番目の値の分だけフレームを挿入
		for (i = 0; i < n; i++){
			tl.setSelectedFrames([sfhead +i, selectedFrames[1] , selectedFrames[2]], true);
			tl.insertFrames(diffarray[i]);
		}
	}
}

4 Comments to “階段状にフレームを挿入するjsflコマンド”

  1. hiroe:

    はじめまして。
    新作が出るたびにわくわくしながら見ています。
    ソースも公開されていらっしゃるのでFLASH初心者の私には大変勉強になります。
    そのソースの方なのですが、FrameIntoFunctionのサンプルを見ようと思って開いてみたら・・・「スクリーンが使われているのでこのFlash8じゃ見れネェよ」と出ました・・・orz
    学校のプロフェッショナルだと問題なく見れるのですがうちのベーシックではスクリーンに対応してないので開けませんでした。
    PP08CMからのようなので最近使い方をマスターしたとか、そんな感じですかね?

    長くなってしまいましたのでこの辺りで。
    次の作品も期待してます(`・ω・´)b

  2. yama_ko:

    >hiroeさん
    はじめまして。感想ありがとうございます。
    ソースについてですが、PrismとPOPMIX6th以外は全て8pro以上が必要かと思います。最近からではなく、Glowmotionの頃からブレンドモードとカスタムイージング多用してるのですが…。
    ちなみに上サンプルではスクリーンは使ってないと思います。カスタムイージング使ってますが。
    もしかしたらCS3で保存していたのかもと思い、念のため8で保存しなおしてみました。

  3. 散蓮華 » Blog Archive » 拡張機能のまとめのまとめ:

    […] Mattari Blog - 階段状にフレームを挿入するjsflコマンド […]

  4. Flashの拡張機能(JSFLなど)のまとめ | studio-c3:

    […] 最近導入した、【FLASH7,8】ライブラリ一発整理 拡張機能が良い感じで重宝してます。あと、階段状にフレームを挿入するjsflコマンドも重宝しそう。 Author: c3 Categories: Flash Tags: コメント (0) トラックバック (0) コメントをどうぞ トラックバック […]

Comment