[JSFL]の最近のブログ記事

リンケージ設定JSFLコマンド
LinkageSettings.mxp

  • クラスパスに「/」が入力できなかったのを修正
  • 参照ボタンが正常に動作していなかったので修正
  • 「ActionScriptに書き出し」にデフォルトでチェックが入るように変更
  • 「ActionScriptに書き出し」にチェックが入っていないときは「クラスファイルを作成する」を選択できないように変更
上の2つはかなり致命的な欠陥だったのに今まで気づかなかった。
自分で使えよって話なんですが。

上記以外は変わってないですが、今回の修正で結構便利度アップしたと思いますよ。

例えば
/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」だった場合、このコマンドを実行すると、
ステージ上のインスタンス名は「testButton」になります。

変更はこれだけですが、AS3では思いのほか便利になったと思います。

上の「リンケージ設定コマンド」と併用するとさらに便利。
クラス名はシンボル名が適用されて、インスタンス名は先頭文字だけ小文字
って状況はAS3では良くあるんじゃないでしょうか。

思い当たる人は是非使ってみてくださいませ。

--追記
なんかディレクトリ構成の例が変だけど気にしないで(汗

--更に追記
Embedタグの記述箇所が変だったのと、symbolパラメータの値が正しく入力されてなかったので
再修正してアップしました。
LinkageSettings.mxp

--しつこくも更に追記
クラス作成時、インスタンス変数を追加する際に、変数の型をすべて「DisplayObject」にしていましたが
クラスの割り当てがされているインスタンスについては、設定されたクラスを追加するようにしました。
指定クラスファイルが存在しない場合は基本クラスに設定されているクラスが指定されます。
さらに基本クラスがデフォルトである場合は DisplayObject が指定されます。
(基本クラスが Sprite や MovieClip 等である場合、JSFLでは判定できないため)

また、上記変更に伴い、import 文が長く(複数行)になる場合があるので
import 文はソートした状態で書き加えられるように変更しました。(可読性向上のため)

LinkageSettings.mxp

リンケージの設定と同時にクラスファイルを自動生成する
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 のままで変更できません。
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コマンドを実行すると
エラーが表示されて、アプリケーションが強制終了してしまう。
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.png

ファイルはこちら
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