*サンプルデータ(Zip圧縮/約40KB)のソースFLAファイルを開くにはFlash MX 2004、外部ASファイルには同Professional版あるいはエディタが必要です。
1. 厳密な型指定
1-1 タイムラインでの代入式
代入式は、両辺の変数に型指定が必要(スクリプト001)。タイムライン上のスクリプト(フレームアクションやMovieClipアクションなど)は、クラス定義ファイルと扱いの異なることがある(thisなど)。
スクリプト001■厳密な型指定と代入
// _root
// フレームアクション
var my0_str = 1; // 接尾辞は型指定と無関係→エラーなし
var my1_str:String = my0_str; // 右辺の値が型指定なし
var my1_str:String = 1; // ストリング型指定変数に数値代入→エラー
|
1-2 型指定はスクリプトペイン内で有効
タイムライン上での型指定は、スクリプトペイン内でのみ有効。記述フレームが異なったり(スクリプト002)、フレームアクションとMovieClipアクションにまたがると、型指定は及ばない。
スクリプト002■フレームにまたがる型指定と代入
// 第1フレームアクション
var my_str:String = "string";
// 第2フレームアクション
var nMyNumber:Number = my_str; // エラーなし
|
1-3 インスタンスの型指定
タイムラインに配置したインスタンスにも、型指定が可能(スクリプト003)。
スクリプト003■インスタンスの型指定
var my_txt:TextField; // TextField型指定
var nMyNumber1:Number = my_txt.text; // 上記指定なければエラーなし
var nMyNumber2:Number = _root; // タイムラインは型指定されている→エラー
|
1-4 タイムライン上のthisは型指定なし
タイムライン上のthisは、型指定のないプロパティとして扱われることに注意(スクリプト004)。なお、ActionScript 2.0クラス定義ファイル内では、thisは自動的にクラスの型で指定される。
スクリプト004■タイムライン上のthisは型指定されない
trace(this); // 出力: _level0
var nMyNumber3:Number = this; // thisは型指定されない→エラーなし
var my_str:String = "string";
var nMyNumber4:Number = this.my_str; // 型指定のないインスタンスのプロパティは型を調べない→エラーなし
|
1-5 関数の型指定
function(関数)には、引数(パラメータ)と戻り値を型指定できる(スクリプト005)。
スクリプト005■関数の型指定(function.fla)
// MovieClipアクション
// function.fla
onClipEvent (load) {
// 関数getAngle: xy座標から角度を度数で返す
// 引数: nX:x座標(数値), nY:y座標(数値)
// 戻り値: 度数(数値)
function getAngle(nX:Number, nY:Number):Number {
var nRadian:Number = Math.atan2(nY, nX);
return nRadian/Math.PI*180;
}
}
onClipEvent (mouseUp) {
trace(getAngle(_xmouse, _ymouse));
}
|
2. ActionScript 2.0とFlash Player 7 − パブリッシュ設定
2-1 Flash PlayerとActionScriptのバージョン指定
[パブリッシュ設定]では、Flash Playerの[バージョン]と[ActionScriptのバージョン]を、それぞれ指定することができる(図001)。
図001■[パブリッシュ設定]
[Flash Player 6]では[ActionScript 2.0]を選択することも可能
2-2 Flash Player 7の仕様変更(ECMA-262準拠)
Flash Player 7で仕様変更: 大文字小文字の区別/未定義変数の扱い/ストリングの論理値評価
参考:
F-site:「Flash MX 2004でハマりがちな問題点」
「ECMA-262第4版準拠」
ストリングの論理値評価は、文字列の長さが0(空文字)ならflase、それ以外はtrueを返す(スクリプト006)。ユーザー入力のチェックが、簡単になった。
スクリプト006■文字列が空でないかどうかの判定(ECMA262.fla)
// ButtonまたはMovieClipアクション
// TextFieldインスタンス_root.my_txtを配置
on (release) {
if (!_root.my_txt.text) { // 文字列が空(長さ0)の場合
_root.my_txt.text = "No entry!";
}
}
|
2-3 ActionScriptの最適化 − レジスタの拡張
最大256個のレジスタがパフォーマンスを向上(Flash MXまでは4個)。なお、[Flash Player 6r65用に最適化]オプションでも、最適化の効果がある。
2-4 コンパイル時実装
ActionScript 2.0の厳密な型指定は、コンパイル(SWF書出し)時のみの機能。SWFのバイトコード(Flash Player用中間言語)には、書出されない。
3. スクリプトのスタイル
3-1 MovieClipアクション − Flash 5スタイル
Flash 5では、基本的なイベントはMovieClipアクションのイベントハンドラメソッドで処理する(スクリプト007。型指定のない本来のFlash 5対応のスクリプトについては、Flash5.fla参照)。減速するアニメーションの考え方は、「MovieClipのターゲットパスとプロパティ」参照。
スクリプト007■MovieClipアクションで定義したスクリプト(Flash5withTyping.fla)
// MovieClip: マウスポインタに向かって回転するインスタンス
// MovieClipアクション
onClipEvent (load) {
// 初期設定
var deceleration:Number = 0.2;
// 関数定義
function rotateTo(nRelativeRotation:Number):Void {
_rotation += nRelativeRotation;
}
function getAngle(nX:Number, nY:Number):Number {
var nRadian:Number = Math.atan2(nY, nX);
return nRadian/Math.PI*180;
}
}
onClipEvent (enterFrame) { // アニメーション処理
var nRelativeRotation:Number = getAngle(_xmouse, _ymouse);
rotateTo(nRelativeRotation*deceleration);
}
|
3-2 フレームアクションに一括 − Flash MXスタイル
Flash MXから採用されたイベントハンドラアクションを使用すれば、イベントハンドラをフレームアクションに設定できる(スクリプト008)。スクリプトをフレームアクションに一括すると、見通しがよくなる。
スクリプト008■イベントハンドラメソッドを使用したフレームアクション(FlashMX.fla)
// MovieClip: マウスポインタの方向に回転するインスタンス
// 第1フレームアクション
// 初期設定
var deceleration:Number = 0.2;
// 関数定義
function rotateTo(nRelativeRotation:Number):Void {
_rotation += nRelativeRotation;
}
function getAngle(nX:Number, nY:Number):Number {
var nRadian:Number = Math.atan2(nY, nX);
return nRadian/Math.PI*180;
}
this.onEnterFrame = function() { // イベントハンドラメソッド定義
var nRelativeRotation:Number = getAngle(_xmouse, _ymouse);
rotateTo(nRelativeRotation*deceleration);
};
|
3-3 ActionScript 1.0によるクラス定義
ActionScript 1.0では、コンストラクタ関数とFunction.prototypeプロパティを使って、クラスとそのメソッドの定義を行う(スクリプト009)。基本的にthis参照が必須。
スクリプト009■コンストラクタ関数とFunction.prototypeで定義したActionScript 1.0クラス(ActionScript1Class.fla)
// MovieClipシンボル: リンケージ識別子"Pen"
// MovieClip: マウスポインタの方向に回転するインスタンス
// 第1フレームアクション
#initclip
function Rotation() { // コンストラクタ関数
}
Rotation.prototype = new MovieClip(); // MovieClipクラスを継承
Rotation.prototype.deceleration = 0.2;
// メソッド定義
Rotation.prototype.rotateTo = function(nRelativeRotation) {
this._rotation += nRelativeRotation;
};
Rotation.prototype.getAngle = function(nX, nY) {
var nRadian = Math.atan2(nY, nX);
return nRadian/Math.PI*180;
};
Rotation.prototype.onEnterFrame = function() {
var nRelativeRotation = this.getAngle(this._xmouse, this._ymouse);
this.rotateTo(nRelativeRotation*this.deceleration);
};
// シンボルへのクラス登録
Object.registerClass("Pen", Rotation);
#endinitclip
|
4. ActionScript 2.0クラス定義
ActionScriptファイルを作成して、ActionScript 2.0クラス定義を行う。スクリプトは、SWFに書出される。
表001■ActionScript 2.0のクラス定義
スクリプトの記述場所 |
外部ActionScriptファイル。 |
ファイル名 |
クラス名と同一。拡張子.as。 |
クラス定義 |
classステートメント。 |
コンストラクタ関数 |
クラス名と同一(省略可)。 |
プロパティ |
コンストラクタ関数外にvar宣言。型指定可能。 |
メソッド |
function定義。引数と戻り値の型指定可能。 |
継承 |
extendsキーワード。 |
クラス定義の中身(本体)は、var宣言したプロパティとメソッド(関数)定義のみ(ともに型指定可能)。ActionScript 1.0のクラス定義(スクリプト009)と比べて、構造がわかりやすい(スクリプト010)。
スクリプト010■ActionScript 2.0によるクラス定義ファイル(Rotation.as)
// ActionScript 2.0クラス定義ファイル: Rotation.as
class Rotation extends MovieClip { // クラス定義: MovieClipクラスを継承
// プロパティ宣言
var deceleration:Number = 0.2;
// メソッド定義
function rotateTo(nRelativeRotation:Number):Void {
_rotation += nRelativeRotation;
}
function getAngle(nX:Number, nY:Number):Number {
var nRadian:Number = Math.atan2(nY, nX);
return nRadian/Math.PI*180;
}
function onEnterFrame() {
var nRelativeRotation:Number = getAngle(_xmouse, _ymouse);
rotateTo(nRelativeRotation*deceleration);
}
}
|
Flashムービー側は、シンボルにActionScript 2.0クラスを設定するだけ(図002)。
図002■ActionScript 2.0クラスの設定(ActionScript2Class.fla)
シンボルプロパティの[AS 2.0クラス]にクラスを入力
_____
作成者: 野中文雄
作成日: 2004年7月13日