[AS3] ビットマップをダイナミックに配置する [Edit]

[ライブラリ]のビットマップ(図001)を、ActionScript 3.0でダイナミックに配置してみましょう。

図001■[ライブラリ]に格納されたビットマップ
FF0608101_005.gif

クラスのリンケージ

まず、[ライブラリ]のオプションポップアップメニューから、[リンケージ]を選択して[リンケージプロパティ]ダイアログボックスを開きます。[リンケージ]オプションの[ActionScriptに書き出し]にチェックをつけたうえで、[クラス]のテキストボックスに、任意のクラス名を入力します[*1]

図002■[リンケージプロパティ]ダイアログボックス
FF0608101_006.gif

指定した名前のクラスはとくに定義していませんので、確認のダイアログが表示されます。ここで[OK]ボタンをクリックすると、その名前のクラスが自動的に生成されます(図003)。

図003■クラスを自動生成するかどうかの確認
FF0608101_007.gif

ビットマップを作成して表示する

これでビットマップにクラスが設定できましたので、スクリプトを使ってインスタンスをダイナミックに作成することができます。インスタンスの作成するには、つぎのようにnew演算子を使ってコンストラクタ関数を呼出します。

var 変数:データ型 = new クラス名();

ビットマップに対して、クラス名をPenと設定しました。変数名は、myBitmapDataとしましょう。生成されるデータ型は、BitmapDataになります[*2]。すると、ビットマップデータのインスタンス生成は、以下のステートメントで行います。ふたつの引数は、ビットマップデータのそれぞれ幅と高さです。今回は、ともに0で構いません。

var myBitmapData:BitmapData = new Pen(0, 0);

もっともこれだけでは、ビットマップデータのインスタンスは画面に表示されません。DisplayObjectContainer.addChild()メソッドを用いて、タイムラインの表示階層を管理するディスプレイリストに加える必要があります(「new演算子でビジュアルオブジェクトをつくる」参照)。

ところが、BitmapData型のデータは、DisplayObjectContainer.addChild()メソッドに引数として渡すことができません。ActionScript 3.0では、不適切なデータ型の引数を渡すとエラーが発生して、SWFは書出せません。

そこで、BitmapDataオブジェクトを使って、Bitmapクラスのインスタンスを生成するというステップを加えます。Bitmapインスタンスは、DisplayObjectContainer.addChild()の引数として用いることができます。BitmapDataインスタンスは、Bitmapコンストラクタに引数として渡します。

したがって、[ライブラリ]のビットマップにクラス名Penを設定して、タイムラインにダイナミックに表示させる最小限のスクリプトは、つぎのとおりです(スクリプト001・図004)。

スクリプト001■ビットマップをダイナミックに配置する(最小限)
// フレームアクション
// ビットマップからBitmapDataインスタンスを生成
var myBitmapData:BitmapData = new Pen(0, 0);
// BitmapDataを用いてBitmapインスタンスを生成
var myBitmap:Bitmap = new Bitmap(myBitmapData);
// タイムラインのディスプレイリストに追加
addChild(myBitmap);

図004■表示されたビットマップ
FF0608101_004.jpg

ただし、後々クラスを定義するようになる場合も考えれば、importステートメントを明示的に記述する癖をつけておく方がよいでしょう(スクリプト002)[*3]

スクリプト002■ビットマップをダイナミックに配置する(標準)
// フレームアクション
import flash.display.Bitmap;
import flash.display.BitmapData;
var myBitmapData:BitmapData = new Pen(0, 0);
var myBitmap:Bitmap = new Bitmap(myBitmapData);
addChild(myBitmap);


[*1] クラス名は識別子であれば、どのような名前でも結構です(なお、識別子の決まりについては、「ActionScriptとその基本概念について」「06 ActionScript 2.0とFlash Player 7」の「Word□識別子」参照)。ActionScript 2.0/1.0と異なり、リンケージの識別子(Identifier)を設定する必要はありません。

[*2] 正確には、ビットマップに設定したクラスPenは、BitmapDataをスーパークラスとして作成されます。

var myBitmapData:BitmapData = new Pen(0, 0);
trace(myBitmapData is BitmapData); // Output: true
trace(myBitmapData is Pen); // Output: true

[*3] 別の処理方法を試したサンプルとして、ActionScript 3.0 Sample「ライブラリの画像をbitmapDataで表示(フレーム内)」があります。

[追記] 2007.07.15
Flash 9 ActionScript 3.0 Previewをもとにした解説と画像を、Flash CS3 Professionalに合わせて修正しました。Flash CS3のActionScript 3.0では、BitmapDataクラスのコンストラクタを呼出すには、ふたつの引数を必ず渡さなければならなくなりました。

その他の記事