サイトトップ

Director Flash 書籍 業務内容 プロフィール
Flash OOP FLASH OOP − ActionScriptによるオブジェクト指向プログラミング
>>>補足および正誤表

JaGra PROFESSIONAL SCHOOL 公開講座
オブジェクト指向で考えるFlash ActionScript上級テクニック
Flash ActionScript 2.0初級
Flash ActionScript 2.0中級


JaGra PROFESSIONAL SCHOOL Seminar
ActionScript 2.0とは?


*サンプルデータ(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日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.