今回のサンプルを最小限ActionScript 3.0で動くように修正するだけでしたら、さほど手間はかかりません。まず、メインタイムラインに関数getAngle()を定義したフレームアクション (スクリプト01-002)は、そのままActionScript 3.0で動作します。
MovieClipのフレームアクション(スクリプト02-001)を修正するには、大きくふたつのポイントがあります。第1は、イベントハンドラ メソッドに替えて、イベントリスナーを使うことです。第2に、プロパティの名前が、ActionScript 3.0では変わりました。これらの修正を施したのが、つぎのスクリプトです。
// MovieClip: マウスを追いかけて回転するインスタンス
// 第1フレームアクション
var nDeceleration:Number = 0.2;
addEventListener("enterFrame", function (eventObject:Event):void {
var nDegree:Number = root.getAngle(mouseX, mouseY);
rotation += nDegree*nDeceleration;
});
まず、イベントリスナーを登録するために、EventDispatcher.addEventListener()メソッドを使います。ActionScript 3.0では、クラスが大規模な階層構造になりました。EventDispatcherクラスはMovieClipクラスの上位階層にあたり、MovieClipの「スーパークラス」と呼ばれます*6。スーパークラスであるEventDispatcherに定義されたaddEventListener()メソッドは、下位階層つまり「サブクラス」であるMovieClipが自らのメソッドと同じように使用できます。
ActionScript 1.0/2.0のイベントハンドラメソッドは、インスタンスに設定すればイベントを受取って処理することができました。しかし、ActionScript 3.0では、予めインスタンスにイベントリスナーを登録する必要があります。インスタンスはイベントを受取ったら、直接その処理はせずに、登録されたリス ナーにその処理を委ねます。これは一見、まだるこしい手続きに感じられるかもしれません。
しかし、たとえば企業でお客様電話窓口があった場合、さまざまな問合せや要望、クレームが寄せられます。それらを、その窓口の部署自らが処理してい たら、とても対応しきれません。通常は、その処理を適切な部署に回付することでしょう。窓口は情報の受付と担当部門への通知に専念することで、企業として さまざまな声を受止め、かつそれらを必要に応じて専門的に処理することが可能になるのです。
イベントリスナーというのは、役割分担に適した仕組みです。大規模なプロジェクトや複雑な処理を、企業の部門分けのように、適切な単位に小分けして 分担できることがその利点です。もっとも、今回のサンプルは、文法的な確認が主眼ですので、ごく単純な場合です。アニメーションを処理するための enterFrameイベントに、リスナーをひとつだけ登録して処理しています。
EventDispatcher.addEventListener()メソッドは、イベントを受取るインスタンスをターゲットとして、つぎのように使用します。このシンタックス(構文)は、バージョン2アーキテクチャ(Flash MX 2004およびFlash 8)のコンポーネントのEventDispatcher.addEventListener()メソッドとほぼ同じです。
インスタンス.addEventListener(イベント, 関数);
スクリプト03-001で、インスタンスはフレームアクションを設定しているMovieClip自身ですから、省略しています(thisをターゲットにしても構いません)。イベントは"enterFrame"と、文字列で記述します。関数は、名前のない関数で指定しました*7。このスクリプト03-001の記述方法は、入力の手間を省いた必要最小限の書き方です。後で、もう少し応用しやすく、ミスも防げる記述の仕方をご紹介します。
つぎに、プロパティの名前を修正します。ActionScript 3.0のプロパティには、名前の先頭にアンダースコア「_」がつきません。ですから、ActionScript 1.0/2.0の_rootやMovieClip._rotationプロパティは、DisplayObject.rootおよびDisplayObject.rotationに修正します。また一部には、アンダースコア(「_」)を取るだけではなく、名称の変わったプロパティもあります。MovieClip._xmouseやMovieClip._ymouseプロパティがそれで、DisplayObject.mouseXとDisplayObject.mouseYプロパティに名前が変わります。
| 変更方法 | ActionScript 1.0/2.0*8 | ActionScript 3.0*9 |
|---|---|---|
| 「_」削除 | _root、_alpha、_height、_parent、_rotation、_visible、_width、_x、_y | root、alpha、height、parent、rotation、visible、width、x、y |
| 名称変更 | _xmouse、_xscale、_ymouse、_yscale | mouseX、scaleX、mouseY、scaleY |
表03-001: ActionScript 1.0/2.0からActionScript 3.0へのプロパティ名変更の例
*6 スーパークラスとサブクラスとのつがりを「継承」と呼びます。ActionScript 3.0のMovieClipクラスは、つぎのようにいくつものスーパークラス経て、EventDispatcherクラスを継承しています。
MovieClip > Sprite > DisplayObjectContainer > InteractiveObject > DisplayObject > EventDispatcher > Object
なお、ActionScriptにおける継承については、「ActionScript 2.0と1.0の継承について」をご参照ください。
*7 名前のない関数については、注釈[*5]に引用した「名前のない関数(匿名関数/関数リテラル)」をご参照ください。
*8 グローバルプロパティの_rootを除いて、MovieClipクラスのプロパティを例として掲げました。同名のプロパティが、他のクラスにも存在することもあります。
*9 例として挙げたプロパティは、いずれもDisplayObjectクラスに定義されているものです。DisplayObjectは、MovieClipのスーパークラスになります(注釈[*6]参照)。