Macromedia Flash非公式テクニカルノート ドット演算子と配列アクセス演算子
インスタンスのプロパティにアクセスしたり、メソッドを呼出すときには「ドット演算子(.)」を使います[*1]。他方、Arrayクラスの配列インスタンスからエレメントを取出す角かっこ(ブラケット)「配列アクセス演算子([])」でも、配列にかぎらずさまざまなオブジェクトのプロパティにアクセスすることができます。本稿では、ドット演算子(.)と配列アクセス演算子([])について、その意味と使い方をご説明します。
01 ドット演算子
また、同じくタイムラインの第10フレームに移動して再生を続ける場合には、this参照に対してMovieClip.gotoAndPlay()メソッドを呼出します(スクリプト002)。 スクリプト002■MovieClip.gotoAndPlay()メソッドを呼出
前掲スクリプト001のフレームアクションで、タイムラインにint型変数nFrameを宣言して、フレーム番号を納めました。この変数の値を[出力]パネルに表示するには、つぎのステートメントを書きます(スクリプト003)。 スクリプト003■タイムラインの変数値を参照
ActionScriptではメソッドはプロパティに含まれます[*3]。また、変数もユーザーが定義したプロパティと見ることができます。したがって、ドット演算子(.)は、オブジェクトのプロパティにアクセスする機能をもつといえます。 ドット演算子(.)は、階層化されたMovieClipのターゲットパスを参照する場合にも用いられます。たとえば、タイムラインに配置されたMovieClipインスタンスmy_mcの水平座標を10ピクセル右に移動するには、つぎのようにターゲットパスを指定してスクリプトを書きます。 スクリプト004■タイムラインに配置したMovieClipの座標を移動
this参照の後のドット演算子(.)に続けてmy_mcが指定されているのは、子インスタンスmy_mcがフレームアクションの書かれた親タイムラインのプロパティと捉えられていることを意味します。このようにドット演算子(.)は、オブジェクトがもつあらゆるプロパティにアクセスする手段なのです。 【ドット演算子(.)】
02 配列アクセス演算子
ドット演算子(.)と異なり、配列アクセス演算子([])にはプロパティを文字列で渡します。したがって、配列アクセス演算子([])に変数を指定すると、その変数から文字列を取出してその名前のプロパティにアクセスします(スクリプト006)。 スクリプト006■文字列が納められた変数を配列アクセス演算子に渡して参照
プロパティを文字列で指定できるということは、上記スクリプト006のようにプロパティ名を変数に入れて扱えるということです。さらに、動的につなぎ合わせた文字列から、プロパティ名をつくることもできます(ただし、後述03「配列アクセスを使う場合はかぎられる」参照)。つまり、プロパティ名が、ダイナミックに変更できることを意味します。 そこで、操作するインスタンスのプロパティを、ランダムに定めてみましょう。つぎのスクリプト007は、タイムラインのインスタンスmy_mcをクリックするたびに、ランダムな方向に移動または回転します。 スクリプト007■インスタンスをランダムな方向に移動または回転する
配列の変数(properties_array)には、操作するプロパティ名の文字列"x"、"y"、"rotation"をエレメントとして納めました。インスタンス(my_mc)をクリックすると、リスナー関数(xRandomMove())が配列からひとつのプロパティ名をランダムに取出し、配列アクセス演算子([])で参照したインスタンスのプロパティに±10加(減)算しています。 ひとつ注意しなければならないのは、前掲スクリプト004を配列アクセス演算子([])で書替える場合です。スクリプト004は、つぎのようにthis参照が省けます。
しかし、配列アクセス演算子([])を使ってつぎのように書くと、#1084シンタックスエラーになります(図001)[*5]。 ["my_mc"].x += 10; // シンタックスエラー 図001■配列アクセス演算子の左側オペランドがないとシンタックスエラー スクリプト004を書替えた前の例では、this参照と一緒にドット演算子(.)が除かれていることにご注意ください。ドット(.)を残したまま「.my_mc.x += 10」と書けば、ドット演算子でもシンタックスエラーになります。つまり、ドット演算子(.)も配列アクセス演算子([])もともに、左側オペランドにオブジェクトの参照がなければならないのです(スクリプト008)。 スクリプト008■タイムラインに配置したMovieClipの座標を配列アクセス演算子で移動
【配列アクセス演算子([])】
03 配列アクセスを使う場合はかぎられる どちらの演算子でも使えるときは、ドットアクセスの方が簡単で確実です。タイプする文字数は少なくて済むうえ、プロパティやメソッドがコードヒントで選べます。また、型指定されたプロパティや変数を参照するときは、ドットアクセスの方が配列アクセスと比べて最適化されます(「ActionScript 3.0におけるパフォーマンス向上のヒント」01「データ型を指定する」)。 配列アクセスを使う意味があるとすれば、いくつものプロパティをダイナミックに切替えて参照する場合でしょう。つぎのスクリプト009をMovieClipシンボルのフレームアクションに設定すると、キーボードから上下左右の湯印キーでインスタンスをその方向に1ピクセルずつ動かせます(図002)。 図002■上下左右の矢印キーでインスタンスが動く
配列の変数(keys_array)には各矢印キーコードのインデックスに入れ子の配列エレメントを加え、それそれの子配列に各キーで操作するプロパティの文字列("x"か"y")と移動ピクセル数(±1)を納めています。 キーボードイベントInteractiveObject.keyDown(定数KeyboardEvent.KEY_DOWN)のリスナー関数(xKeyDown())は引数のKeyboardEventオブジェクトから押されたキーのコード(KeyboardEvent.keyCodeプロパティ)を調べ、その整数値を関数(xMove())に渡して呼出します。 渡された値が矢印キーのコードなら配列(keys_array)のそのインデックスに子配列があるので、操作するプロパティの文字列と移動ピクセル数を取出して、配列アクセスによりインスタンスを動かします。このスクリプトの中身について詳しくは、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第15回「配列を使ったキーコードとプロパティの扱い」の「配列アクセス演算子でプロパティを操作する」をお読みください。 このスクリプト009(関数xMove())はキーコードを条件にして振分ければ、ドットアクセスで書くこともできます。その方がスクリプトの速さでは勝るでしょう。けれど、それぞれのキーに応じた操作が配列(keys_array)にまとめられ、条件判定よりキーコードの振分けがすっきりすることは魅力です。ことさら速さが求められる場合でないなら、この手法を選ぶ理由は十分にあります[*6]。 ActionScript 2.0までは、インスタンス名に決まりを定め、それらのインスタンスを配列アクセスでまとめて処理するというテクニックがよく用いられました。しかし、ActionScript 3.0では、インスタンス名にもとづく処理は、お勧めすべき利点がほとんど見当たりません[*7]。例をふたつほど挙げましょう。 ひとつは、インスタンスをforループでまとめて処理したいときです。連番のインスタンス名をつければ、文字列とカウンタ変数をつなぎ合わせて配列アクセスで参照できます。たとえば、タイムラインに置いた3つのインスタンスmy0_mc〜my2_mcをすべて非表示にするには、つぎのようなforループの処理を書きます。
しかしこのような場合、処理するインスタンスを予め配列に納めておけば、名前に頼ることがありません。
もうひとつは、別のインスタンスと名前で関連づけることです。組合わせたいインスタンスの名前に共通の番号を含めるといったやり方が考えられます。たとえば、サムネイルのインスタンスbutton0_mc〜button2_mcにマウスでロールオーバーしたとき、それぞれに対応する大きな画像のインスタンスmy0_mc〜my2_mcを表示するとしましょう(図003)。 図003■サムネイルを並べて対応する画像はすべて重ねておく サムネイルと大きい画像は、インスタンス名の中の数字で対応させます。また、大きい画像はすべて重ねて非表示にしておき、ロールオーバーしたサムネイルに対応するインスタンスだけを表示します。フレームアクションは、つぎのスクリプト010のようになります。 スクリプト010■サムネイルにロールオーバーすると名前が対応するインスタンスを表示する
マウスイベントInteractiveObject.rollOver(定数MouseEvent.ROLL_OVER)のリスナー関数(xShow())は、まず引数に受取ったイベントオブジェクト(MouseEvent)のEvent.currentTargetプロパティからロールオーバーしたインスタンスを調べ、その名前の文字列をDisplayObject.nameプロパティで取出します。 つぎに、表示するインスタンスの名前が共通する初めの2文字("my")とロールオーバーしたインスタンス名からとった終わりの4文字(数字 + "_mc")を組合わせて、表示すべきインスタンスを配列アクセスで参照します(show_mc)。 そして、表示するインスタンスをすべて前掲と同じスクリプトで一旦非表示にした後、表示すべきインスタンスのDisplayObject.visibleプロパティをtrueにして改めて表示しています(なお、F-site「ラジオボタンのように複数の中のひとつだけ設定値を変える」参照)。[ムービープレビュー]を確かめると、ロールオーバーしたサムネイルに対応する画像のインスタンスが表示されます(図004)。 図004■サムネイルにロールオーバーすると対応するインスタンスが表示される サムネイルのインスタンスがMovieClipであれば、対応する画像のインスタンスをその変数に設定できます[*8]。そうすればこのサンプルも、インスタンス名を用いなくて済みます。そのように書替えたのが、つぎのスクリプト011です。 スクリプト011■サムネイルにロールオーバーすると変数が参照するインスタンスを表示する
サムネイルのインスタンス(button0_mc〜button2_mc)にはみな同じ名前の変数(show_mc)を設けて、それぞれ対応するインスタンス(my0_mc〜my2_mc)の参照を設定しました。 リスナー関数(xShow())は、前掲スクリプト010と同じようにロールオーバーしたインスタンスを調べて、名前の文字列(DisplayObject.nameプロパティ)を取出すことなく、変数から対応するインスタンスの参照を得ます。そして、そのインスタンスを表示しています。 なお、インスタンスをすべて非表示にする処理は、関数(xClearAll())として定めました。このスクリプトの中身について詳しくは、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第31回「マウスのロールオーバー」の「サムネイルへのロールオーバーで表示画像を切替える」をお読みください。 上記スクリプト011でしいて配列アクセスを使うとすれば、初期設定でしょう。つぎのようなforループで処理すれば(関数xInitialize())、とくにインスタンスの数が多いときにはスクリプトを書く手間が少しだけ省けます(図005)。
図005■初期設定を関数内のforステートメントで処理する もっとも、本当にインスタンスの数が増えたら、予めタイムラインに置いて名前をつけるという作業そのものが現実的でなくなります。そこで、インスタンスを動的につくるようになると、インスタンスは直接配列に加え、必要な設定をすればよく、名前は要らなくなります。そうした意味でも、配列アクセスを使う場面はかぎられることになるでしょう。
作成者: 野中文雄 Copyright © 2001-2011 Fumio Nonaka. All rights reserved. |
||||||||||||||||||||||||||