DisplayObject (表示オブジェクト) の metadata 属性

DisplayObject のインスタンスから metadata という属性が利用できるようになっています。パブリッシュのターゲットを Flash Player 11.6 (SWF version 19) 以降に設定した場合に有効な属性です。

metadata を利用すると、個々の表示オブジェクトのインスタンスの振る舞いを、実行時に決定することができるようになります。例えば、以下のようにして、表示する位置を指定できます。

var parms:Object = myInstance.metadata;
myInstance.x = params.x;

実際にこの機能がサポートされる表示オブジェクトは、シンボル (ムビクリ、テキスト等) とビットマップ限定 (少なくとも今のところ) です。

従来から、UI コンポーネントなどでは、インスタンスのプロパティをオーサリング時にパネルから設定し、実行時の表示を制御するというワークフローが提供されていました。今では、通常のムービークリップもコンポーネントのように扱えるわけです。

なお、オーサリング環境としては、Flash Professional CC から、この機能に対応しました。

ただし、メタデータ設定用の新規パネルが追加されたということではなくて、メタデータを設定する JSAPI が追加されただけ、です。そのため、ユーザーが必要な JSAPI を呼び出す SWF パネル、HTML パネル、もしくは JSFL コマンドを用意しなければなりません。ということで、使うにはややハードルの高い機能となっています。

メタデータを設定する JSAPI

JSAPI でメタデータを設定するには、まず、対象となる表示オブジェクトを取得します。ステージ上に配置されているオブジェクトは、以下のようにして取得できます。

var doc = fl.getDocumentDOM(); // FlashのDOMの取得
if (doc) {
  // 最初のレイヤーの最初のフレームの最初のオブジェクトを取得
  var elem = doc.getTimeline().layers[0].frames[0].elements[0];
} 

取得されるオブジェクトは Element オブジェクトです。Element には、Flash Pro CC から、以下の 3 つの JSAPI が追加されています。

void     setPersistentData(name:String, type:String, value)
variable getPersistentData(name:String)
void     removePersistentData(name:String)

最初の setPersistentData() がステージ上のオブジェクトにメタデータを設定するメソッドです。引数は 3 つで、データの名前、型、値の順に指定します。型として指定できるのは、integer, double, string の 3 種類です。

例えば、以下のコードは "position" という名前で "static" という値をオブジェクトに設定しています。

elem.setPersistentData("position", "string", "static");

一旦このコードが実行されると、設定された値は Fla ファイル内に保持されます。そのため、一度ファイルを保存してから開いてみると、メタデータはそのまま残っています。

getPersistentData() は、メタデータが保存されていれば、そのデータを取得できます。その際取得されるデータの型は、保存時の型ですが、型情報は返されません。これは利用する側が覚えていないといけないようです。

パブリッシュ設定用の JSAPI

Element オブジェクトにメタデータを設定しただけだと、パブリッシュしても SWF にメタデータは埋め込まれません。設定されたメタデータをパブリッシュの対象に含めることを宣言する JSAPI が別途提供されており、これもあわせて使用します。

以下が、Element に追加された JSAPI です。

void setPublishPersistentData(name:String, format:String, publish:Boolean)
Boolean getPublishPersistentData(name:String, format:String)

setPublishPersistentData() は、パブリッシュ時に特定のメタデータを書き出しに含めるかを指定します。最初の引数に対象となるメタデータの名前を指定します。2 つ目の引数に "_EMBED_SWF_" を指定すると、SWF に埋め込むという意味になります。3 つ目の引数は true ならパブリッシュの対象にする、false ならパブリッシュ対象にしない、という意味です。

さらに、もう 1 つおまじないが必要です。メタデータを設定したオブジェクトを含む Flash の DOM に対しても、同様にメタデータのパブリッシュ設定を指定します。

以下が、Document オブジェクトに追加された JSAPI です。こちらは個別のメタデータ名は指定しません。

void setPublishDocumentData(format:String, publish:Boolean)
Boolean getPublishDocumentData(format:String)

引数の format には、Element オブジェクトに指定したフォーマットと "同じもの" を指定します。

ということで、SWF にメタデータを書き出すには、最低以下のようなコードを用意することになります。

var doc = fl.getDocumentDOM(); // FlashのDOMの取得
if (doc) { // Elementオブジェクトの取得
  var elem = doc.getTimeline().layers[0].frames[0].elements[0];
 
  if (elem) { // メタデータの設定&パブリッシュの設定
    elem.setPersistentData("position", "string", "static");
 
    elem.setPublishPersistentData("position", "_EMBED_SWF_", true);
    doc.setPublishDocumentData("_EMBED_SWF_", true);
  }
}

このように、オブジェクトとドキュメントそれぞれにパブリッシュ設定のメソッドを用意することで、詳細な書き出しの制御ができるようになっています。

とすると、実際のワークフローでは、上のようなコードで一気にメタデータに関する処理を行うよりは、メタデータのパブリッシュ設定を全体のパブリッシュ設定の一部として指定したくなってきます。このあたりは、今年 5 月の MAX で予告されていた HTML で Flash Pro のパブリッシュ画面もつくれるようになるという機能が実装されれば実現できるかもしれません。ということで、楽しみに待ってみましょう。

SWF 埋め込み以外の書き出し

さて、パブリッシュ設定する JSAPI に、わざわざフォーマット指定の引数が用意されていることからも想像できる通り、SWF 埋め込み以外のフォーマット、例えば JSON や XML 形式でメタデータを外部ファイルに書き出すことが可能です。

JSON 等で書き出しておけば、CreateJS や Dart のツールキットで HTML コンテンツとしてパブリッシュした場合でも読み込んで利用できますし、また、CreateJS の最適化に必要な情報をメタデータとして渡す、といった使い方も考えられます。

といっても、現時点で Flash Pro が標準で対応しているフォーマットは SWF 埋め込みのみです。その他の形式で書き出す場合は、自分で JSFL を用意しなければなりません。 (せめて JSON くらいはそのうち用意されると良いのですが)

パブリッシュの設定はフォーマットごとに指定するという仕様になっています。そのため、あるメタデータを SWF に埋め込んで、同時に JSON としても書き出したい場合は、以下のような記述になります。

elem.setPersistentData("position", "string", "static");
// 2種類のフォーマットをそれそれ指定
elem.setPublishPersistentData("position", "_EMBED_SWF_", true);
elem.setPublishPersistentData("position", "_EXTERN_JSON_", true); 
doc.setPublishDocumentData("_EMBED_SWF_", true);
doc.setPublishDocumentData("_EXTERN_JSON_", true); 

ライブラリ内のアイテムへのメタデータ設定

ステージ上に配置されたオブジェクトだけでなく、ライブラリ内のアイテムにもメタデータを設定する JSAPI が追加されています。ただし、こちらは SWF に埋め込まない場合、つまり外部データとして書き出す場合限定です。

参考までに、ライブラリのアイテムを JSAPI で取得するには以下のようにします。

var itemArray = fl.getDocumentDOM().library.items;

これで Item オブジェクト (上のコードだと Item の配列) を取得できます。

Item オブジェクトにメタデータを設定する JSAPI は以下の通りです。使い方は Element オブジェクトの場合と同様ですが、メソッド名からこちらはパブリッシュ時に呼ばれることを前提としたものであると想像されます。

void setPublishData(name:string, format:String, publish:Boolean)
Boolean getPublishData(name:String,format:String)

このような JSAPI が用意されているということで、将来的には、ライブラリのアイテムを選択して CreateJS 用のアセットとして書き出す、といった使い方もできるようになるのかもしれません。

JSAPI について、より詳しい情報は、Flash Professional の拡張機能をご覧ください。

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/462

コメントする

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261