前述のスクリプト03-001は、動作するための最小限の記述です。後々の応用や拡張を考えると、不十分な点がふたつあります。それらを考慮して、ActionScript 3.0の標準的なフレームアクションに書替えてみましょう。

図04-001: ActionScript 3.0の標準的なフレームアクションに修正
第1に、このままではイベントリスナーが必要なくなったとき、削除することができません。イベントリスナーを削除するには、EventDispatcher.removeEventListener()メソッドを呼出します。その引数に、削除すべきリスナーとして、EventDispatcher.addEventListener()メソッドに登録してある関数(function)を渡す必要があります。
インスタンス.removeEventListener(イベント, 関数);
ところが、EventDispatcher.addEventListener()に名前のない関数で指定してありますと、どこにも参照が残されていないので、取得しようがありません。そういう訳ですので、EventDispatcher.addEventListenerメソッドに指定するとき、関数には予め名前をつけて定義しておく方が、望ましいということになります。
したがって、イベントリスナーに設定するfunctionを、まず通常の名前のある関数として定義します。定義したタイムライン上では、関数はその名前で参照することができます。ですから、EventDispatcher.addEventListenerメソッドには、引数のイベントリスナーとしてその関数名を渡します。
第2は、importステートメントの記述です。
前節で述べたとおり、「ActionScript 3.0では、クラスが大規模な階層構造になりました」。それらのクラスは、「パッケージ」という機能により、カテゴリー分けされています。パッケージは、ディスクのフォルダ/ディレクトリと同じツリー構造になっていて、パスで表します。ただし、パスの区切り文字はスラッシュ(/)ではなく、ドット(.)です。
たとえば、MovieClipクラスの完全パス表記(「完全修飾クラス名」と呼ばれます)は、flash.display.MovieClipとなります。このflash.displayの部分がパッケージです。ディスク内でファイルを分類・整理して格納するフォルダと同じ役割を、このパッケージが果たします。パッケージのクラスを使うためには、スクリプトの冒頭でimportステートメントを記述して、パッケージ(flash.display)とクラス名(MovieClip)をドット(.)で結んだ「完全修飾クラス名」(flash.display.MovieClip)の宣言が必要です。
import 完全修飾クラス名;
前述のスクリプト03-001では、flash.display.MovieClipクラスの(スーパークラスも含めた)プロパティやメソッドにアクセスしているほか、イベントを管理しそのイベントについての情報を保持するflash.events.Eventクラスも利用しています。したがって、これらのクラスをimportステートメントで、スクリプトの冒頭に宣言する必要があるのです*10。
もっとも、スクリプト03-001は、importステートメントを記述することなく、正しく動作しています。「これは、Flashのタイムラインには、デフォルトで必要なクラスが自動的にimportされるためです」*11。ですから、スクリプトをフレームアクションに記述し、ActionScript定義済みのおもなクラスを使うかぎりにおいて、importステートメントは必ずしも書かなくても構いません。
けれども、フレームアクションでなくクラスを外部ファイルに定義する場合や、ActionScriptに定義されていない自作あるいは他の人が作成したクラスを利用する場合、さらには自動的にimportされる以外のクラスを用いる場合などに、importの必要性を忘れてあわてる可能性があります。そうならないためには、少なくともimport宣言が必要であることをつねに意識すべきで、またそれを徹底するためにあえてimportステートメントを記述することも有効だと思われます。
さらに、もうひとつ追加したいことがあります。EventDispatcher.addEventListenerメソッドの第1引数に渡すイベントです。"enterFrame"という文字列で渡すことは、もちろん誤りではありません。しかし、この値は、Event.ENTER_FRAMEという定数(プロパティ)で指定することができます。
Event.ENTER_FRAME定数には、結局"enterFrame"という文字列が設定されています。ですから、直接文字列で指定した場合と、動作結果は変わりません。しかし、Event.ENTER_FRAMEを使うと、ふたついいことがあります。
第1は、綴りミスでエラーが返されることです。たとえば、すべて大文字でなければいけない定数の記述に、小文字を交えてEvent.Enter_Frameと書くと、SWF書出し時にエラーが発生します。ところが、文字列の場合には、"EnterFrame"と書いても、何のエラーを生じることもなく、ただ単に動かなくなります。
Event.ENTER_FRAME定数を使う利点の第2は、イベントリスナーとして指定した関数に渡される引数のデータ型が明らかになることです。Eventクラスの定数を指定したということは、イベントリスナーは引数としてEventインスタンスを受取ります。ですから、当然引数は、Eventで型指定されます。これがたとえば、マウスクリックを受取りたい場合であれば、イベントはMouseEvent.CLICKで指定します*12。すると、イベントリスナーの関数は、引数をMouseEventで型指定すればよいとわかります。
以上3つの点を考慮してスクリプト03-001を修正すると、つぎのようになります。
// MovieClip: マウスを追いかけて回転するインスタンス
// 第1フレームアクション
import flash.display.MovieClip;
import flash.events.Event;
var nDeceleration:Number = 0.2;
addEventListener(Event.ENTER_FRAME, enterFrame);
function enterFrame(eventObject:Event):void {
var nDegree:Number = root.getAngle(mouseX, mouseY);
rotation += nDegree*nDeceleration;
}
*10 「ActionScript 3.0では、パッケージに定義されたクラスを参照する際には、必ずimportステートメントを記述する必要があります」(F-site「importの使い方が変わった」)。「この仕様は、以前のバージョンのActionScriptとは異なります」(「import指示子」)。ActionScript 2.0では、「import指示子を使わなくても、完全修飾クラス名を使えば、クラスを参照することは可能」でした(前出「importの使い方が変わった」)。
*11 詳しくは、前出注釈[*10]「import指示子」の[訳者注*1]をご覧ください。
*12 マウスイベントについいては、「マウスイベント」をご参照ください。