[JSFL]の最近のブログ記事
リンケージ設定JSFLコマンド
LinkageSettings.mxp
自分で使えよって話なんですが。
上記以外は変わってないですが、今回の修正で結構便利度アップしたと思いますよ。
例えば
ステージ上に配置されたシンボル「HomeButton」「WorksButton」「ContactButton」の3つを選択して
このコマンドを実行した場合、
クラスファイルの記述もちょいちょい設定できます。
使い方は前回の記事のままです。
不明点があればどうぞ遠慮なく聞いてください。
以前の記事で、複数のシンボルがどうのこうのと注意事項で書いてますが、
特に気にしなくても使えると思います。
インスタンス名にシンボル名を設定するJSFLコマンド
setInstanceName.mxp
ステージ上のインスタンス名は「testButton」になります。
変更はこれだけですが、AS3では思いのほか便利になったと思います。
上の「リンケージ設定コマンド」と併用するとさらに便利。
クラス名はシンボル名が適用されて、インスタンス名は先頭文字だけ小文字
って状況はAS3では良くあるんじゃないでしょうか。
思い当たる人は是非使ってみてくださいませ。
--追記
なんかディレクトリ構成の例が変だけど気にしないで(汗
--更に追記
Embedタグの記述箇所が変だったのと、symbolパラメータの値が正しく入力されてなかったので
再修正してアップしました。
LinkageSettings.mxp
--しつこくも更に追記
クラス作成時、インスタンス変数を追加する際に、変数の型をすべて「DisplayObject」にしていましたが
クラスの割り当てがされているインスタンスについては、設定されたクラスを追加するようにしました。
指定クラスファイルが存在しない場合は基本クラスに設定されているクラスが指定されます。
さらに基本クラスがデフォルトである場合は DisplayObject が指定されます。
(基本クラスが Sprite や MovieClip 等である場合、JSFLでは判定できないため)
また、上記変更に伴い、import 文が長く(複数行)になる場合があるので
import 文はソートした状態で書き加えられるように変更しました。(可読性向上のため)
LinkageSettings.mxp
LinkageSettings.mxp
- クラスパスに「/」が入力できなかったのを修正
- 参照ボタンが正常に動作していなかったので修正
- 「ActionScriptに書き出し」にデフォルトでチェックが入るように変更
- 「ActionScriptに書き出し」にチェックが入っていないときは「クラスファイルを作成する」を選択できないように変更
自分で使えよって話なんですが。
上記以外は変わってないですが、今回の修正で結構便利度アップしたと思いますよ。
例えば
/project
/bin
index.fla
/src
Main.as
上記のようなディレクトリ構成で、index.flaを開いて作業いていた状態でステージ上に配置されたシンボル「HomeButton」「WorksButton」「ContactButton」の3つを選択して
このコマンドを実行した場合、
クラスパス: ../src クラス名: demo.buttons.* 基本クラス: *上記の設定で「クラスファイルを作成する」にチェックを入れて実行すると
/project
/bin
index.fla
/src
Main.as
/demo
/buttons
HomeButton.as
WorksButton.as
ContactButton.as
上記のようにファイルが作成されます。クラスファイルの記述もちょいちょい設定できます。
使い方は前回の記事のままです。
不明点があればどうぞ遠慮なく聞いてください。
以前の記事で、複数のシンボルがどうのこうのと注意事項で書いてますが、
特に気にしなくても使えると思います。
インスタンス名にシンボル名を設定するJSFLコマンド
setInstanceName.mxp
- 先頭の文字を小文字に変換する
ステージ上のインスタンス名は「testButton」になります。
変更はこれだけですが、AS3では思いのほか便利になったと思います。
上の「リンケージ設定コマンド」と併用するとさらに便利。
クラス名はシンボル名が適用されて、インスタンス名は先頭文字だけ小文字
って状況はAS3では良くあるんじゃないでしょうか。
思い当たる人は是非使ってみてくださいませ。
--追記
なんかディレクトリ構成の例が変だけど気にしないで(汗
--更に追記
Embedタグの記述箇所が変だったのと、symbolパラメータの値が正しく入力されてなかったので
再修正してアップしました。
LinkageSettings.mxp
--しつこくも更に追記
クラス作成時、インスタンス変数を追加する際に、変数の型をすべて「DisplayObject」にしていましたが
クラスの割り当てがされているインスタンスについては、設定されたクラスを追加するようにしました。
指定クラスファイルが存在しない場合は基本クラスに設定されているクラスが指定されます。
さらに基本クラスがデフォルトである場合は DisplayObject が指定されます。
(基本クラスが Sprite や MovieClip 等である場合、JSFLでは判定できないため)
また、上記変更に伴い、import 文が長く(複数行)になる場合があるので
import 文はソートした状態で書き加えられるように変更しました。(可読性向上のため)
LinkageSettings.mxp
リンケージの設定と同時にクラスファイルを自動生成する
Flash CS3 用の JSFLコマンドをアップしました。
LinkageSettings.mxp
Flashのメニューから「コマンド」>「LinkageSettings」で使用できます。
このコマンドを呼び出す際は、以下の条件が必要です。
まだベータ版ってことで、Macで検証できてないのと、 AS2 には使用できません。
実行すると以下のダイアログが表示されます。

特徴
注意事項
困ってること
もしどなたか Mac 環境で検証してくれるって方がおられましたら
是非以下の JSFL ファイル(DirectoryTest.jsfl)を使用して、
出力された結果を教えていただけませんでしょうか。
directory_access_test.jsfl
ちなみに「 Windows XP SP2 / Flash CS3 」での出力結果は以下のようになりました。 ご参考まで。
以後、ゆっくりとですが調整していく予定です。
Flash CS3 用の JSFLコマンドをアップしました。
LinkageSettings.mxp
Flashのメニューから「コマンド」>「LinkageSettings」で使用できます。
このコマンドを呼び出す際は、以下の条件が必要です。
- flaファイルが保存されたもの。
(新規作成で開いた状態で未保存の場合は使用できません。) - ステージ上のシンボル、もしくはライブラリ内のシンボルを1つ以上選択した状態であること。
- ドキュメントのActionScriptのバージョンが3であること。
まだベータ版ってことで、Macで検証できてないのと、 AS2 には使用できません。
実行すると以下のダイアログが表示されます。

特徴
- ステージ上、もしくはライブラリ内で選択中の複数のシンボルをまとめてリンケージ設定可能
- リンケージの設定対象は MovieClip, Bitmap, Font, Sound, Button の5種類です。
- リンケージ設定時にクラスファイルが存在しない場合、自動で生成することができます。
- クラスファイルの自動生成時に特定のイベントを追加しておくことができます。
- クラスファイルの自動生成時にEmbedタグを設定しておくことができます。
- 複数選択時、クラス名に*を使用することで、各シンボル名と同名のクラスを作成します。
例)classes.display.* - 複数選択時、基本クラス名に*を使用することで、
各アイテムのデフォルトで割り当てられるクラスを基本クラスに設定することができます。 - 対象がムービークリップの場合、内包するインスタンス名を変数宣言しておくことができます。
- 対象がムービークリップの場合、タイムライン上のスクリプトを調べて、クラス内に addFrameScript として設定することができます。
- 書き出すクラスファイルのテンプレートは単独のファイルとなっているため、比較的容易に編集が可能です。
"Commands/seyself/templates/as3_class.tmpl" がテンプレートファイルです。
テンプレートファイル内で[XXXX]と書かれている箇所が、
それぞれ置き換えられる場所になっているので、編集の際はご注意ください。
注意事項
- まだ検証が十分ではありませんので、ご使用には注意してください。
特に複数のシンボルをまとめてリンケージ設定する際に、クラス生成も同時に行うと
予期せぬ結果になる可能性があります。 - クラスパスは相対パスで記述してください
- Embedタグを追加した際、自動的にswfファイルへの参照が記述されますが、
この機能はflaファイルの位置を指しています。
flash側でパプリッシュ先を、他のディレクトリに指定を変更した場合でも、
flaファイルの位置を元に書き込まれます。
困ってること
- Flash側でSWFのパブリッシュ先を変更した場合の、書き出し先の取得方法が分かりません。
- XULがよく分からず、表示パネルの外枠がやたらデカくて困ってます。
- Mac にて検証する環境がないため、ディレクトリの指定等がまったく分かりません。
もしどなたか Mac 環境で検証してくれるって方がおられましたら
是非以下の JSFL ファイル(DirectoryTest.jsfl)を使用して、
出力された結果を教えていただけませんでしょうか。
directory_access_test.jsfl
ちなみに「 Windows XP SP2 / Flash CS3 」での出力結果は以下のようになりました。 ご参考まで。
//==== Directory Access Test ==== ■fl.configURI = file:///C|/Documents%20and%20Settings/wada/Local%20Settings/Application%20Data/Adobe/Flash%20CS3/ja/Configuration/ ■document.path = D:\wada\00_works\2008_latter\20080709_test_commands\flash\20080709\index.fla ■fl.browseForFolderURL() = file:///C|/flex_sdk_3/bin ■fl.browseForFileURL() = file:///C|/Program%20Files/Adobe/Adobe%20Flash%20CS3/Flash.exe //==== Test Complete ====
以後、ゆっくりとですが調整していく予定です。
現状 Flash CS3 では、 JSFLで画像(BitmapItem)のリンケージ設定で
「ActionScript に書き出し」の設定をしようとしても値が false のままで変更できません。
で、ちょっと無茶な方法ですが以下のようにスクリプトを変更します。

このように「ランタイム共有用に書き出し」が true に設定された状態で、
「ActionScript に書き出し」は設定されていないという、パネルを直接操作しても
再現出来ないようなおかしなことになってますが、このときのBitmapItem のプロパティを
出力すると以下のようになります。
この状態であれば、linkageClassName、linkageBaseClass 共にスクリプトで設定しなおすことが出来ます。
linkageURL はそのまま空でもパブリッシュは可能です。
このJSFLコマンドを実行した後、リンケージパネルを変更せずに
以下の ActionScript をタイムラインに書いてプレビューしてみると、
ちゃんと書き出されてることが確認できます。
linkageClassName は JFSL に追記して "image_jpg" に変更しています。
Bitmap に設定したクラス名とファイルを配置した SWF の URL が分かれば、
他のドキュメントソースファイルから「ランタイム共有用に読み込み」で読み込んでしまえる。
残念ながら linkageExportForRS を false にすると、結局 AS への書き出しも行われなくなってしまうので
今のところ対処方法はまだわかりません。無いのかもしれない。
FlashDevelop + FlexSDK とかで開発する上で、
SWF から [Embed] タグで画像を読み込む分には使えるかもしんない。
それをしないといけない状況があるかどうかなんですが。
「ActionScript に書き出し」の設定をしようとしても値が false のままで変更できません。
item.linkageExportForAS = true; alert(item.linkageExportForAS); // output : false
lib.setItemProperty('linkageExportForAS', true);
alert(item.linkageExportForAS); // output : false
プロパティを直接設定しても、 setItemProperty を使っても同じです。で、ちょっと無茶な方法ですが以下のようにスクリプトを変更します。
var item = fl.getDocumentDOM().library.getSelectedItems()[0]; if(item.itemType=="bitmap") item.linkageExportForRS = true; item.linkageExportForAS = true; item.linkageExportInFirstFrame = true;こうすると、ライブラリからマウス操作でリンケージパネルを開いたとき、以下のようになります。

このように「ランタイム共有用に書き出し」が true に設定された状態で、
「ActionScript に書き出し」は設定されていないという、パネルを直接操作しても
再現出来ないようなおかしなことになってますが、このときのBitmapItem のプロパティを
出力すると以下のようになります。
linkageExportForRS = true linkageExportForAS = undefined linkageExportInFirstFrame = true linkageClassName = image.jpg linkageBaseClass = allowSmoothing = false compressionType = photo quality = -1 useImportedJPEGQuality = true itemType = bitmap name = items/image.jpg linkageImportForRS = undefined linkageIdentifier = image.jpg linkageURL =linkageClassName(太字)のところを見ると、クラスが設定されています。
この状態であれば、linkageClassName、linkageBaseClass 共にスクリプトで設定しなおすことが出来ます。
linkageURL はそのまま空でもパブリッシュは可能です。
このJSFLコマンドを実行した後、リンケージパネルを変更せずに
以下の ActionScript をタイムラインに書いてプレビューしてみると、
ちゃんと書き出されてることが確認できます。
linkageClassName は JFSL に追記して "image_jpg" に変更しています。
import flash.display.Bitmap; addChild(new Bitmap(new image_jpg(1,1)));ただし、「ランタイム共有用に書き出し」を行ってしまうので、これを使うと
Bitmap に設定したクラス名とファイルを配置した SWF の URL が分かれば、
他のドキュメントソースファイルから「ランタイム共有用に読み込み」で読み込んでしまえる。
残念ながら linkageExportForRS を false にすると、結局 AS への書き出しも行われなくなってしまうので
今のところ対処方法はまだわかりません。無いのかもしれない。
FlashDevelop + FlexSDK とかで開発する上で、
SWF から [Embed] タグで画像を読み込む分には使えるかもしんない。
それをしないといけない状況があるかどうかなんですが。
FLASH CS3 / Windows XP sp2 で以下のJSFLコマンドを実行すると
エラーが表示されて、アプリケーションが強制終了してしまう。
エラーメッセージ
右クリックで「更新」を選択するのと同じ機能を実行するもの。
同様のコマンドを FLASH 8 で実行しても、問題なく処理されるので
CS3のバグっぽい。
ちなみに「Just-In-Time デバッグ」を無効にしたり
レジストリを削除もしてみたが、そうすると今度は
エラーメッセージなしに強制終了されてしまった。
解決策が今のところ見当たらないので、FLASH 8 と共有で使う場合は
便利なコマンドなだけに早く直してほしい。
エラーが表示されて、アプリケーションが強制終了してしまう。
fl.getDocumentDOM().library.updateItem();
エラーメッセージ
Flash.exe [4076]でハンドルされていない Win32 の例外が発生しました。 この例外の Just-In-Time デバッグに失敗し、次のエラーが発生しました: インストールされたデバッガで Just-In-Time デバッグが有効になっていません。 Visual Studio では、[ツール]メニューの[オプション]を選択し、[デバッグ]にある[Just-In-Time]から Just-In-Time デバッグを有効にできます。 詳細については、ドキュメントの Just-in-time デバッグのエラーについてのトピックを参照してください。このコマンドはライブラリ内で読み込んだ画像やサウンドファイルを選択して、
右クリックで「更新」を選択するのと同じ機能を実行するもの。
同様のコマンドを FLASH 8 で実行しても、問題なく処理されるので
CS3のバグっぽい。
ちなみに「Just-In-Time デバッグ」を無効にしたり
レジストリを削除もしてみたが、そうすると今度は
エラーメッセージなしに強制終了されてしまった。
解決策が今のところ見当たらないので、FLASH 8 と共有で使う場合は
var fv = Number(String(fl.version).split(" ")[1].split(",")[0]);
if( fv < 9 ){
fl.getDocumentDOM().library.updateItem();
}
として、CS3 では実行しないようにしといた方がいいかも。便利なコマンドなだけに早く直してほしい。
ライブラリ内のシンボルや画像などの素材を探すために使います。

ファイルはこちら
LibrarySearch.mxp
検索を実行すると、下のリストにマッチする名前のアイテムを表示します。
それらの中から、目的のアイテムを選択すると、ライブラリ内で、そのアイテムが選択されます。
フォルダ内にある場合は、フォルダも開きます。
同時に選択したアイテムのリンケージ情報も出力パネルに出力します。
AS2、AS3両対応。
Flash 8 と CS3 で確認しています。
AS3の場合
AS2の場合
ItemSearch.mxp

ファイルはこちら
LibrarySearch.mxp
検索を実行すると、下のリストにマッチする名前のアイテムを表示します。
それらの中から、目的のアイテムを選択すると、ライブラリ内で、そのアイテムが選択されます。
フォルダ内にある場合は、フォルダも開きます。
同時に選択したアイテムのリンケージ情報も出力パネルに出力します。
AS2、AS3両対応。
Flash 8 と CS3 で確認しています。
AS3の場合
[Library Item] : contents/main
AS3.0 クラス : Main
AS3.0 基本クラス : flash.display.MovieClip
ActionScript に書き出し : true
最初のフレームに書き出し : false
AS2の場合
[Library Item] : main
識別子 : main
AS2.0 クラス : Main
ActionScript に書き出し : true
最初のフレームに書き出し : false
ステージ上のアイテムをライブラリ内から探すショートカット用コマンドも。ItemSearch.mxp
何度も WindowSWF フォルダ内のファイルを追加、削除していると
Flash8 の「他のパネル」から開いた時に、名前とパネルが一致しなくなってくる。
このときは、一旦 Flash を閉じて WindowSWFフォルダ内のファイルをすべて別の場所に
移動させて、空の状態で再度 Flash を起動。
もう一度 Flash を閉じた後、WindowSWFフォルダにファイルを戻して
再び Flash を起動すると、ちゃんとパネルが開けられるようになる。
Flash8 の「他のパネル」から開いた時に、名前とパネルが一致しなくなってくる。
このときは、一旦 Flash を閉じて WindowSWFフォルダ内のファイルをすべて別の場所に
移動させて、空の状態で再度 Flash を起動。
もう一度 Flash を閉じた後、WindowSWFフォルダにファイルを戻して
再び Flash を起動すると、ちゃんとパネルが開けられるようになる。
こんなのも。
拡張ウィンドウパネル
ClipBoardLuncher.swf
テキストをリストに登録、1クリックでクリップボードにコピーされます。
LinkagePanel.swf
AS2用のリンケージ設定パネルです。
複数同時に設定が可能です。
NamberingPanel.swf
選択したステージ上の複数のムービークリップに連番付きのインスタンス名を設定します。
* が連番に置き換えられます。(例:symbol_*_text など )
Start No に0付きの数値を入力すると、桁数を揃えます。
連番を割り当てる順番と開始番号の設定が可能です。
以下は、自分で作ってはみたものの使い道がなかったり、挙動がいまいちだったりするもの。
ご利用は自己責任でお願いします。
FunctionTree.swf
タイムライン上のFunction定義を探して階層表示します。
SecondActionPanel.swf
アクションパネルをもう1枚、ってときに。
一応編集もできますが、あまりお勧めできません。
拡張ウィンドウパネル
ClipBoardLuncher.swf
テキストをリストに登録、1クリックでクリップボードにコピーされます。
LinkagePanel.swf
AS2用のリンケージ設定パネルです。
複数同時に設定が可能です。
NamberingPanel.swf
選択したステージ上の複数のムービークリップに連番付きのインスタンス名を設定します。
* が連番に置き換えられます。(例:symbol_*_text など )
Start No に0付きの数値を入力すると、桁数を揃えます。
連番を割り当てる順番と開始番号の設定が可能です。
以下は、自分で作ってはみたものの使い道がなかったり、挙動がいまいちだったりするもの。
ご利用は自己責任でお願いします。
FunctionTree.swf
タイムライン上のFunction定義を探して階層表示します。
SecondActionPanel.swf
アクションパネルをもう1枚、ってときに。
一応編集もできますが、あまりお勧めできません。
なんか巷のFlasher方の間で流行ってるみたいなので、
手持ちのものをいくつかアップしておく。
探せばどっかにありそうなのばっかりだけども。
setInstanceName.jsfl
選択したステージ上の1つ、もしくは複数のムービークリップのインスタンス名をシンボル名と同じ名前に設定します。
getInstanceName.jsfl
選択したステージ上の1つ、もしくは複数のムービークリップのインスタンス名を出力パネルに表示します。
実行するとプロンプトが表示され、入力した文字を付加して表示します。
[$$]は複数行、[##]は1行で表示します。
setButtonLabel.jsfl
レイヤーを追加し、そのレイヤーに _up, _over, _down, _disabled のラベルを付けたフレームを作成します。
BmpPropLosles.jsfl
ライブラリ内の選択した複数のビットマップ画像をロスレスに設定します。
ConvertSymbol.jsfl
選択したステージ上のムービークリップ、ビットマップ画像を左上を基点としたムービークリップに変換します。
実行するとプロンプトに名前が入力された状態で表示されますので、そこで変更が可能です。
ItemSearch.jsfl
選択したステージ上のムービークリップをライブラリの中から探して選択します。
NextKeyFrame.jsfl
選択中のフレームの次のキーフレームを選択します。
PrevKeyFrame.jsfl
選択中のフレームの1つ前のキーフレームを選択します。
Numbering.jsfl
選択したステージ上の複数のムービークリップに連番付きのインスタンス名を設定します。
1つ目のプロンプトにベースとなる名前を入力します。
2つ目のプロンプトには連番の開始番号を入力します。
連番は x=0, y=0 に近いものから順に設定されます。
setZeroPosition.jsfl
選択したステージ上のムービークリップの位置座標を整数値に丸め込みます。
SplitFrames.jsfl
選択中の複数のレイヤーを1つのレイヤー上に、フレーム毎に分割して配置します。
手持ちのものをいくつかアップしておく。
探せばどっかにありそうなのばっかりだけども。
setInstanceName.jsfl
選択したステージ上の1つ、もしくは複数のムービークリップのインスタンス名をシンボル名と同じ名前に設定します。
getInstanceName.jsfl
選択したステージ上の1つ、もしくは複数のムービークリップのインスタンス名を出力パネルに表示します。
実行するとプロンプトが表示され、入力した文字を付加して表示します。
[$$]は複数行、[##]は1行で表示します。
setButtonLabel.jsfl
レイヤーを追加し、そのレイヤーに _up, _over, _down, _disabled のラベルを付けたフレームを作成します。
BmpPropLosles.jsfl
ライブラリ内の選択した複数のビットマップ画像をロスレスに設定します。
ConvertSymbol.jsfl
選択したステージ上のムービークリップ、ビットマップ画像を左上を基点としたムービークリップに変換します。
実行するとプロンプトに名前が入力された状態で表示されますので、そこで変更が可能です。
ItemSearch.jsfl
選択したステージ上のムービークリップをライブラリの中から探して選択します。
NextKeyFrame.jsfl
選択中のフレームの次のキーフレームを選択します。
PrevKeyFrame.jsfl
選択中のフレームの1つ前のキーフレームを選択します。
Numbering.jsfl
選択したステージ上の複数のムービークリップに連番付きのインスタンス名を設定します。
1つ目のプロンプトにベースとなる名前を入力します。
2つ目のプロンプトには連番の開始番号を入力します。
連番は x=0, y=0 に近いものから順に設定されます。
setZeroPosition.jsfl
選択したステージ上のムービークリップの位置座標を整数値に丸め込みます。
SplitFrames.jsfl
選択中の複数のレイヤーを1つのレイヤー上に、フレーム毎に分割して配置します。
