分1234前回の第23回「クラスのデザインとループ処理」では,EllipticMotionクラスのデザインを将来の拡張も考えて整理し,タイムラインのフレームアクションでは繰返し処理により複数のインスタンスを配置した(図1⁠)⁠。複数のインスタンスが楕円軌道でアニメーションする今回の課題は,まずインスタンスの回転するスピードを,マウスポインタの位置によって変えることにする。つぎに,インスタンスの重ね順を,3次元風の表現に対応するよう修正しよう。インスタンスの重ね順が3次元風の表現に一部対応していないマウスポインタの位置に応じてインスタンスの回転スビードを変えるまずは,インスタンスが回転するスピードを,マウスポインタの位置によって変えるため,前回のスクリプト2で修正定義したEllipticMotionクラスにもう少し手を加えよう。今のところ,インスタンスのアニメーションは,コンストラクタメソッドEllipticMotion()の本体で,インスタンスごとのDisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)にリスナー関数rotate()を登録して処理している。setRotation();}しかし,同じマウスポインタの座標値を,すべてのインスタンスからいちいち確かめるのは効率がよくない。のちにインスタンスの重ね順をコントロールする際には,それぞれの仮想の奥行きの値をメインタイムラインから調べる必要がある。すれば,タイムラインに配置したインスタンスは,タイムラインのフレームアクションで管理することにしたい。そのうえで,EllipticMotionクラスのrotation()メソッドはタイムラインから呼出し,マウスポインタの座標に応じた回転角の値をその引数として渡そう。Flashムービー(FLA)ファイルのフレームアクションとして作成した前回のスクリプト3には,タイムラインに配置するEllipticMotionインスタンスが納められるべき配列を新たに変数として宣言し,初期化する。続くforループのコードブロック{}の中で,生成したインスタンスを表示リストに入れるとともに,この配列にも加えることにする。(instances_array)からEllipticMotionインスタンスが取出せる。EllipticMotionクラスのrotation()メソッドが呼出せるようになった。そこで,新たな関数rotate()をフレームアクションに定義して,これをタイムラインのDisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)にリスナーとして登録しよう。}}rotate()関数本体では,マウスポインタのステージ中央からの水平位置に応じた回転角(nSpeed)を求めたうえで,forループの処理によりEllipticMotionインスタンスを配列(instances_array)から順にすべて取出し,その回転角の値を各インスタンスのrotate()メソッドに渡して呼出している(※1⁠)⁠。以上ふたつの修正を加えたフレームアクションが,次のスクリプト1だ。}}※1マウスポインタのステージ中央からの水平位置に応じてアニメーションのスピードを変える処理については,第12回「マウスポインタとスクロールの連動」を参照してほしい。