![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||||||
![]() |
Flash OOP for ActionScript 3.0 第2章 ActionScript 2.0から3.0へのガイド
|
[MEMO]2-1-001 ランタイム |
AVM2は、ActionScript 3.0のバイトコードを処理する、専用の仮想マシンとして新たに開発されました。したがって、ActionScript 2.0や1.0は、AVM2では動作しません。しかし、Flash Player 9には、従来のバージョンのバイトコードを処理するAVM1も、併せて搭載されています(図2-1-001)。また、Adobeは将来のFlash Playerについても、AVM1を引続きサポートすると表明しています。
▲図2-1-001■Flash Player 9とAVM
[編集者向け注釈] 森巧尚さんの画像を使っています。イラストを改めて起こしてください。
△ActionScript 3.0用のAVM2と併せて2.0/1.0用のAVM1も搭載されている。
ですから、過去のコンテンツが新しいFlash Playerで動かなくなるということはありません。また、ActionScript 2.0/1.0も、[パブリッシュ設定]で選択すれば、Flash CS3から書出すことは可能です。ただし、ActionScript 2.0/1.0に今後追加されていく機能は、あまり多くを期待できないかもしれません。
[CAUTION]2-1-001 ActionScript 3.0と2.0/1.0は混在できない |
●2-1-2 ActionScript 3.0の特徴
ActionScript 3.0の特徴を、いくつかご紹介します。ここでは、パフォーマンスとランタイム時のデバッグ、および言語体系について、簡単に触れておきます。
○2-1-2-1 パフォーマンス
ActionScript 3.0は、パフォーマンスが大きく向上しました。最適化されたAVM2の処理により、その速度は従来の10倍に達することもあります。ただし、AVMはあくまでActionScriptの処理を行うということに注意が必要です。
アニメーションあるいはテキストの描画、サウンドの制御やサーバとのネットワークのやり取りなどは、Flash Plyer本体で扱います(前掲図2-1-001)。したがって、これらの処理はFlash Playerの細かな改善はあるにしても、ActionScript 3.0を使ったことで差が生じるものではありません。
実際上、アニメーション主体のムービーでは描画にCPUの負荷がかかるため、ActionScript 3.0により処理スピードが速まる場合はかぎられるでしょう。ポルシェで高速に乗っても、他の車で渋滞していたらスピードは上げられないからです。
[COLUMN]2-1-001 ActionScript 3.0でアニメーションの処理速度が向上する例 第1は、描画負荷の小さいインスタンスを、大量にスクリプトで動かす場合です。フォーラムFLASH-japanで森巧尚氏が、5000個の点をランダムに移動させるサンプルを作成して、スピードの違いを紹介しています(<http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=5204&forum=20>)。動かすものを1ドットの点でなく、ボールにしたりグラデーションをかけたりすると、描画の負荷が上がって処理速度はたちまち落ちてしまうでしょう。 第2は、ひとつの動きが、他のインスタンスのアニメーションに干渉するような処理の場合です。複数のインスタンスが互いにゴムのようなもので結ばれて、その中のひとつを動かすと数珠つなぎに他のインスタンスも引っ張られるようなアニメーションが考えられます。たとえば、10個のインスタンスが互いに結ばれていると、ひとつの動きはインスタンス同士の総当たりの数(10×9)の処理を発生させます。したがって、数が増えると大量の処理が求められるからです。本書の共著者深津貴之氏のAMAZNODE(<http://amaznode.fladdict.net/about_ja.html>)がその例です。 |
パフォーマンスが向上したことで得られる最大のメリットは、比較的規模の大きなクラスやライブラリでも、処理速度が落ちなくなったことです。それにより開発者やチームの生産性が上げられるだけでなく、汎用的なライブラリやフレームワークが公開される動きも進むと考えられます。本書の第3章「ActionScript 3.0を使ったサンプル集」では、公開のライブラリやフレームワークを使った例も紹介されます。
○2-1-2-2 ランタイム時のデバッグ
ActionScript 3.0では、ランタイム(実行)時に型指定によるデバッグができるようになりました。
ActionScript 2.0では、データ型を指定するとコンパイル時にエラーがチェックされました。ActionScript 3.0でも、デフォルトではコンパイル時の型チェックは行われます。これを「静的な型指定」のチェックといいます。[パブリッシュ設定]の[ActionScript 3.0設定]で[Strictモード]のチェック(選択)を外すと、Standardモードとなり、コンパイル時の型チェックは行われなくなります(図2-1-002)。
▲図2-1-002■[ActionScript 3.0設定]の[Strictモード]
△[ファィル]→[パブリッシュ設定]の[Flash]タブで[ActionScript設定]ボタンをクリックすると[ActionScript 3.0設定]ダイアログが開く。
他方、ActionScript 3.0では2.0と異なり、型指定の情報がSWFに書出されます。そのため、Flash Player上でランタイム時に、型指定によるエラーが確認できるようになりました。これを「動的な型指定」によるチェックといいます。Flash Player上で実際に処理されているデータにもとづいて、細かなエラーが確認できます。[Strictモード]によるコンパイル時の型チェックも併せれば、より厳密なデバッグができるでしょう。
○2-1-2-3 言語体系
ActionScript 3.0の言語体系は、プログラミング言語としてスタンダードな体系に整理され、シンプルで統一化された仕様になりました。
第1に、仕様の統一化がはかられた例として、インスタンスの生成とイベントハンドリングがあります。インスタンスは、基本的にnew演算子で、コンストラクタを呼出して生成します。ActionScript 2.0のMovieClip.createEmptyMovieClip()とかMovieClip.attachMovie()のような特別なメソッドを使う必要がありません。MovieClipインスタンスは、new MovieClip()の呼出しで生成できます。
[MEMO]2-1-002 ActionScript 2.0から3.0への変更 ▲図2-1-003■[ヘルプ]の「ActionScript 2.0からの移行」 |
[CAUTION]2-1-002[ヘルプ]の「ActionScript 2.0からの移行」の記載漏れ Adobeのサイトに各製品のヘルプが公開されており、Flex 2のドキュメントの同名の項(<http://livedocs.adobe.com/flex/2_jp/langref/migration.html>)には、これらの不足している情報が掲載されています。 |
また、ActionScript 3.0は、イベントの扱いを後述(2-2「」)のイベントリスナーに統合しました。ActionScript 2.0/1.0の場合は、下表2-1-001のとおり、インスタンスに記述するイベントハンドラアクションとフレームに指定できるイベントハンドラメソッド、さらにはリスナーで登録すべきクラスがあったり、また同じリスナーでもコンポーネントではシンタックスが異なったりしました。
▲表2-1-001■ActionScript 2.0のクラスとイベントの処理方法クラス | イベントの処理方法 |
MovieClip、Buttonインスタンス | on()またはonClipEvent()イベントハンドラアクション |
MovieClip、Button、TextField、LoadVars、XMLなど | イベントハンドラメソッド |
Key、Mouse、MovieClipLoader、Stageなど | addListener()で登録したリスナーオブジェクト |
コンポーネント | addEventListener()で登録したリスナーオブジェクト |
ActionScript 3.0のイベントは、addEventListener()メソッドによりリスナー関数を登録して処理します(詳しくは、後述2-2「」参照)。クラスやイベントが異なっても、基本的な扱い方は同じです。ActionScript全体として、一貫した処理方法になりました。
[CAUTION]2-1-003 ActionScript 3.0はインスタンスには記述できない |
第2に、言語体系が整理された結果、クラスやプロパティ、メソッドなどに、細かな変更があります。まず、多くのクラスは「パッケージ」という、クラスを分類するパスに整理されました(ActionScript 2.0でも一部のクラスは、パッケージに属していました)。パッケージについては、クラスの定義と併せて後に解説します。
つぎに、プロパティおよびメソッドの名前や引数、戻り値の指定などが、細かく変わっています。プロパティについては、先頭のアンダースコア(「_」)はなくなり、名称が変更されたものもあります。ActionScript 3.0では、比率を表すプロパティも、基本的にパーセンテージ(%)でなく、100%を1とする小数値を返します。
ActionScript 2.0で先頭にアンダースコア(「_」)のついたプロパティが、3.0になってどのように変わったか、その一部を下表2-1-002に示します。
▲表2-1-002■ActionScript 2.0で先頭に「_」のついたプロパティの3.0への変更例変更内容 | ActionScript 2.0 | ActionScript 3.0 |
「_」の削除 | _root、_parent、_alpha、_rotation、_visible、_width、_height、_x、_y | root、parent、alpha、rotation、visible、width、height、x、y |
名称の変更 | _xmouse、_ymouse、_xscale、_yscale | mouseX、mouseY、scaleX、scaleY |
値が%から小数値に | _alpha、_xscale、_yscale | alpha、scaleX、scaleY |
[MEMO]2-1-003 rootプロパティは仕様も変わった |
メソッドについては、たとえばgotoAndPlay()やgotoAndStop()メソッドで、引数としてフレームの後にシーンが指定できるようになりました。そしてシーン名は、変数で渡すことが可能です(図2-1-004)。
▲図2-1-004■[ヘルプ]のMovieClip.gotoAndPlay()メソッドの項
△シーン名sceneは、オプション(省略可能)。文字列で指定する。
[MEMO]2-1-004 ActionScript 2.0のgotoAndPlay()とgotoAndStop() けれども、他にグローバル関数としてのgotoAndPlay()とgotoAndStop()があり、シーンとフレームのふたつの引数が渡せました。もっとも、これらは古い関数で、内部的にはコンパイル時に移動先フレームを特定してしまう仕様だったため、シーン名を変数で指定することはできませんでした。 |
大きな変更としては、インスタンスのステージへの表示やその重ね順を管理する「表示リスト」が新たに実装されました。これまでダイナミックにインスタンスを作成する際につきまとっていた深度が要らなくなります。また、イベントリスナーで扱われるイベントも、これまでとは仕様が変わっています。表示リストとイベントについては、節を改めて具体的なスクリプティングとともにご説明します(「」および「」)。
これまで述べたとおり、細かな点まで含めれば、ActionScript 2.0と3.0とではさまざまな違いがあります。したがって、すでに作成されたActionScript 2.0のスクリプトが、そのまま3.0でも動作するというケースはかなりかぎられると思われます。
しかし第3として、ActionScript 3.0も2.0と同じく、仕様はECMAScript 4に準拠します。つまり、ActionScript 2.0からの細かな変更はあり、初めはそれらを確認する手間がかかるとしても、基礎となる文法は変わらずひとつの仕様に則っています。
[MEMO]2-1-005 ECMAScript 4 すでに確定した仕様はその第3版で、JavaScriptやJScript、それにActionScript 1.0がこれに準拠します。第4版のECMAScript 4は、まだ策定中です。 |
ですから、ActionScript 3.0の基本と大枠をまず理解すれば、その後の学習効率は大きく高めることができます。本章では、そのポイントを簡単にご紹介します。
●2-1-3 型指定によるパフォーマンスの最適化
AVM2はバイトコードを、ネイティブなマシンコードに変換します(この変換も「コンパイル」と呼ばれます)。そのため、処理もネイティブコードに匹敵するほど速くなるのです。その際に、変数(プロパティ)や関数(メソッド)への型指定が、きわめて重要な意味をもちます。
// 変数の型指定
var 変数名:データ型;// 関数の型指定
function 関数名(引数:データ型):戻り値のデータ型 {
ステートメント;
}
型指定をすると、AVM2がデータ型を認識できるため、コンパイルも最適化されます。すると、その値の参照だけでなく、データのプロパティやメソッドへのアクセスも高速になるのです。AMV2でパフォーマンスを最適化するには、つぎのふたつの条件を満たす必要があります。
- 変数(プロパティ)や関数(メソッド)に型指定する。
- プロパティやメソッドにはドット演算子(.)でアクセスする。
逆に、AVM2によるコンパイルの最適化は、つぎのいずれかの場合には働きません。
- 変数(プロパティ)や関数(メソッド)に型指定しない。
- プロパティやメソッドに配列アクセス演算子[]でアクセスする。
ActionScript 3.0でも、2.0と同じく、型指定をするかどうかは任意(オプション)です。しかし、ActionScript 2.0では、型指定がSWF書出し時のチェックのみで、SWF自体にはデータ型の情報は含まれませんでした。ところが、ActionScript 3.0は、データ型の指定がSWFに保持され、AVM2におけるバイトコードのコンパイルに活用されます。したがって、変数(プロパティ)や、関数(メソッド)の引数・戻り値には、必ず型指定することをお勧めします。
[MEMO]2-1-006 型指定による最適化 |
[Main/Next]
作成者: 野中文雄
更新日: 2008年1月19日[CAUTION]2-1-003を追加。図表の連番のつけ方を変更。
作成日: 2007年12月23日