カテゴリー別アーカイブ: JSFL

Flashのタイムラインを伸ばしたり縮めたりするJSFL


もはやFlashという名前は消えつつありますが、一時期は仕事でかなり使っていたので、思い入れはあります。Flash。

とある長めのFlashのムービーを作っていたんですが、ほとんど作り終わってから、ちょっとムービーが短い、もうちょっと全体的に表示時間を長く、としたい時に、「タイムラインを1.5倍にしたい」と思いました。

が、そんな機能はFlashにはありませんでした…。

そういう時はJSFLがある!ということで探してみましたが、案外いいJSFLは見つからず、2倍にはできるんですが、細かい調整はできないものでした。

仕方がないので、自分で作ってみました。以下になります。

(※場合によってファイルが壊れることもあるので、バックアップはお忘れなく。)

端数が出ることがあるので、最終的に細かい調整は必要ですが、手でタイムラインを伸ばすよりは数十倍楽かと思います。

Flashを使うこともだいぶ減りましたが、こういう自分でなんとかできる感が好きだったりします。標準で用意して欲しい機能ですけれどね。。

ライブラリの選択中のアイテムをフレームに配分するJSFL


Flashで数字入りの画像をタイムラインに並べたい時に、一気に並べられたら便利だなーと思って作ってみた。

正確にはどっかにあるかなーと思って探してみたら、Kayacのブログが出てきたけれど、ファイルをDLできなかったので作ってみたという感じです。

/**
 * 選択中のアイテムをフレームに分配
 */
var _doc = fl.getDocumentDOM();
var _timeline = _doc.getTimeline();
var _lib = _doc.library;

function main(){
     fl.outputPanel.clear();

     var selectedItems = _lib.getSelectedItems();
     var numItem = selectedItems.length;

     if(numItem == 0){
          fl.trace('何も選択されていません');
     }
     else{
          _timeline.convertToKeyframes(0, numItem);
          fl.trace(numItem);
          for(var i = 0; i < numItem; i++){
               var item = selectedItems[i];
               var name = item.name;
               name.match(/[0-9]+/g);
               var num = parseInt(RegExp.lastMatch);
               if(selectedItems.length == 10 && num == 0){
                    num = 10;
               }
               setNumFrame(item, num);
          }
          fl.trace("処理が完了しました");
     }
}

/**
 * 指定したフレームに配置
 */
function setNumFrame(item, frame){
     _timeline.currentFrame = frame - 1;
     _doc.addItem({x:0, y:0},item);
     _doc.selectNone();
     _doc.selectAll();
     var elem = _doc.selection[0];
     var mat = elem.matrix;
     mat.tx = 0;
     mat.ty = 0;
     elem.matrix = mat;
}

main();

使い方

  1. 空のムービークリップを作成、編集モードに入る
  2. ライブラリのアイテムを選択(ライブラリアイテムは数値があるものとする)
  3. コマンドを実行

数値がフレーム番号になります。中を見れば分かるかと思いますが、0~9の時のみ、0番は10フレーム目に置きます(数値を画像にしたとき用)。数字のないものはうまく配置できません。

上をコピペすれば動くと思いますが一応ファイル

使用の際はバックアップなど行ったほうが良いかと思います。あんまり多いとフリーズするかもしれません。50程度は問題なく動きました。(WinXP+CS5で確認)

参考

Flashのライブラリから画像をエクスポートするJSFL


どうもお久しぶりです。

移転してから何も書いてなかったんですが、仕事に余裕がでてきたので何か書いてみようと思う次第であります。

今回のはFlash自体にはありそうでない機能、ライブラリにある画像をファイルとして書き出すJSFLです。

ソースはこんな感じに。

var _doc = fl.getDocumentDOM();
var _lib = _doc.library;
var _exportFolderURI = '';

function main(){
	var selectedItems = _lib.getSelectedItems();
	var numItem = selectedItems.length;
	if(numItem == 0){
		fl.trace("何かファイルを選択してください。");
	}
	else{
		_exportFolderURI = fl.browseForFolderURL('画像の保存先を選択してください');
		if(_exportFolderURI){
			for(var i = 0; i < numItem; i++){
				exportImage(selectedItems[i]);
			}
			fl.trace("エクスポートが完了しました。");
		}
		else{
			fl.trace('キャンセルしました');
		}
	}
}

/**
 * 画像ファイルだったらエクスポート
 * @param item:Item
 */
function exportImage(item){
	if(item.itemType != 'bitmap'){
		return;
	}
	var path = item.name;
	var pathAry = path.split('/');
	var name = pathAry.pop();
	var ext = '';
	if(name.indexOf('.') == -1){
		ext = (item.originalCompressionType == 'photo') ? '.jpg' : '.png';
	}
	
	item.exportToFile(_exportFolderURI + '/' + name + ext);
}
main();

現在選択しているライブラリの~とか余計な部分を省くと、

item.exportToFile(_exportFolderURI + '/' + name + ext);

だけですw 簡単ですね!CS4から使えるようになった機能なので、CS3以前では使えません。圧縮率を戻して画面のキャプチャを取れば大体はなんとかなるかもですが、アルファかかってるものは面倒そうですしね。こちらでさくっとエクスポートするのが良いかと思います。

上のコピペでもいけると思いますが、一応ファイルも。

imageExport.zip

使い方はこちらの公式資料を参考に。CS5でも同じような位置にあるかと思います。

基準点を中心にするJSFLを考える1


普段はアニメーションはTweenerで作っていて、久しぶりにタイムラインでバリバリやる感じのものを作ろうと思い、久しぶりにクラシックトゥイーンなどしてみたんですが、基準点を操作するのがなかなかメンドクサイ。そこでJSFLで何とかならないかと思ったわけです。

作ったのは以下のようなものです。複数選択には対応していません。

var doc = fl.getDocumentDOM();
doc.enterEditMode('inPlace');
var beforeRect = doc.getSelectionRect();
doc.align('vertical center', true);
doc.align('horizontal center', true);
//サイズが奇数値だとセンタリングしたときに端数がでるので調整
var tempRect = doc.getSelectionRect();
var roundX = Math.round(tempRect.left) - tempRect.left;
var roundY = Math.round(tempRect.top) - tempRect.top;
roundX = Math.round(roundX * 10) / 10;
roundY = Math.round(roundY * 10) / 10;
doc.moveSelectionBy({x:roundX, y:roundY});
var afterRect = doc.getSelectionRect();
var moveX = Math.round(beforeRect.left - afterRect.left);
var moveY = Math.round(beforeRect.top - afterRect.top);
doc.exitEditMode();
doc.moveSelectionBy({x:moveX, y:moveY});
doc.setTransformationPoint({x:0, y:0});

とりあえずはシェイプ1つ置いたものならば、基準点と変形点を真ん中に変更できました。

作ってみて気になったのは、getSelectionRectで取得できるRectangle.leftやRectangle.topの値が、100.499など、中途半端な値になってしまうこと。

置き方が悪いのかといろいろやってみましたが、上手くいかないようなので、四捨五入しました。

次はこれをもうちょっと使い易くしてみようと思います。

パブリッシュする時に一緒にtrace文を省略した上で最適化保存してくれるJSFL


あったら便利かなと言うことで作ってみました。

var doc = fl.getDocumentDOM();
var profileXML = doc.exportPublishProfileString();
var newProfile = profileXML.replace("0", "1");
doc.importPublishProfileString(newProfile);
doc.publish();
doc.importPublishProfileString(profileXML);
doc.saveAndCompact();

こちらショートカットに登録すると便利に使えます。・・・使えるんですが、ショートカットを登録してもFlashを起動しただけだとショートカットが有効にならず、必ず1回キーボードショートカットのウィンドウを開かないとできない・・・。何故・・・。

下は開いているflaファイル全てに対して実行できるようにしたもの。

if (fl.documents.length > 0){
    for (i=fl.documents.length-1; i>=0; i--){
        cleanPublish(fl.documents[i]);
    }
}
else{
    fl.trace("ドキュメントが開かれていません。");
}
function cleanPublish(doc){
    fl.setActiveWindow(doc);
    var profileXML = doc.exportPublishProfileString();
    var newProfile = profileXML.replace("<OmitTraceActions>0</OmitTraceActions>", "<OmitTraceActions>1</OmitTraceActions>");
    doc.importPublishProfileString(newProfile);
    doc.publish();
    doc.importPublishProfileString(profileXML);
    doc.saveAndCompact();
}

最初はただ単にfl.documents[i]を関数に渡しただけでできるものかと思ったんですが、こちらと同じ罠に引っかかりました。

http://level0.kayac.com/2009/08/flatrace.php

対処法はいくつか試したんですが、

fl.setActiveWindow(doc);

でOKじゃないかと思います。これで現在開いているドキュメントをアクティブにできるので、fl.documents[i]が選択された状態になり、ドキュメントのプロパティも新しいものが選択されるはずです。

失敗したときは書き出し先が上書きされるという恐ろしい事態になったので、作るときは注意しないとですね。

ちなみに上のスクリプトのご利用は自己判断でご自由にどうぞ。

パッケージ名を自動で全部書き換えてくれるJSFLがあったら便利そう。ただ、JSFLでやる意味はあるのか、という疑問もありますね。ライブラリ内のものは除いて。

flFile.runCommandLine()

を使うとコマンドラインに命令を出せるようなので、こちらからテキスト編集プログラムを実行させた方が早いかもしれないですね。