クラス名を文字列で参照して、コンストラクタを呼出したいことがあります。
たとえば、複数のクラスから、動的にひとつを選んでインスタンスを作成したいという場合です。あるいは、複数のシンボルに[リンケージプロパティ]で連番のクラス名を設定して、ループ処理によりそれらのインスタンスを作成するといった目的も考えられます。本稿では後者を例に、その方法をご紹介します。
まず、ActionScript 3.0で、MovieClipシンボルのインスタンスを動的に作成する方法について、簡単に確認しておきましょう[*1]。
ActionScript 3.0では、シンボルの[リンケージプロパティ]ダイアログボックスで、[識別子]ではなく[クラス]の名前を指定します(図001)。設定したクラスが存在しない場合、Flashは自動的に同名の空のクラスを作成します(図002)。
図001■ActionScript 3.0では[リンケージプロパティ]で[クラス]の名前を指定する
図002■クラスの自動生成を告げるダイアログボックス
シンボルに設定したPenというクラスのインスタンスを動的に作成して、タイムラインに表示するには、つぎのような2行のフレームアクションを記述します。
var myInstance:MovieClip = new Pen(); // インスタンスの生成
addChild(myInstance); // タイムラインへの表示
文字列で指定されたクラス名からクラスの参照を得るには、flash.utils.getDefinitionByName()関数を用います。引数の文字列にクラス名を指定すれば、クラスの参照が返ります。クラスの参照を格納する変数には、Classでデータ型を指定します。ただし、flash.utils.getDefinitionByName()関数の戻り値はObjectですので、Class型の変数に代入するためにはキャストしなければなりません[*2]。
文字列"Pen"が代入された変数name_strを用いて、前記フレームアクションと同じようにインスタンスを作成するには、つぎのようなスクリプトを記述します(スクリプト001)。
スクリプト001■クラス名の文字列からインスタンスを作成する// フレームアクション |
冒頭に採上げた複数のシンボルに連番のクラス名を設定した場合には、forステートメントのループ処理によって、それらのインスタンスを動的に作成することができます。3つのMovieClipシンボルにクラス名を、それぞれ"Pen0"、"Pen1"、"Pen2"と設定したとしましょう。フレームアクションは、つぎのスクリプト002のようになります[*3]。
スクリプト002■複数のシンボルに連番で設定したクラス名を用いてインスタンスを作成する// フレームアクション |
[*1] ビットマップの動的な作成については、「ビットマップをダイナミックに配置する」をご参照ください。
[*2]「キャスト」については、「rootプロパティでメインタイムラインの関数にアクセスできない」の「対処法」[2]「キャスト」および「配列(Array)にキャストする」をお読みください。なお、関連する内容として「as演算子」があります。
[*3] スクリプト002ではスタンダードな記述として、冒頭のステートメントでflash.utils.getDefinitionByNameをimportしています。しかし、スクリプト001と同じく、このステートメントは省略することができます。詳しくは、「importの使い方が変わった」をご参照ください。
● Case Study:04(AS3.0 Ver.) ズームイン・ズームアウトによる画面遷移(2010年03月22日 18:25)
「ActionScript3.0を駆使したプロフェッショナルテクニック」を謳っていながら肝心のサンプルにActionScript2.0が混在しているという...
from ツチノコラボ
この記事へのコメント
●1.takuya084(2009年12月05日 00:37)
大変分かりやすかったです。ちょうど知りたい情報だったので感謝です。