サイトトップ

Director Flash 書籍 業務内容 プロフィール

Object-Oriented ActionScript
Flash MXで実現する進化型Webデザイン

サンプルファイル: OOP_Seminar.zip(Zip圧縮約62KB)
*Class.flaはFlash MX 2004(MyMovieClip.asはクラス定義のテキストファイル)、他のファイルはFlash MXで開くことができます。

以下の内容は、拙著『オブジェクト指向で考えるActionScript − Flash MXでより進んだWebデザイン作成 』(セレンディップ刊)で詳しく解説しています。また、JaGra(社団法人日本グラフィックサービス工業会 )では、この本をテキストとして3日間にわたってオブジェクト指向のActionScriptを学ぶ「オブジェクト指向で考えるFlash MX ActionScript上級テクニック講座」を開催しています。

1 モジュール化以前
ボタンのMovieClipに、すべての処理を記述する。

□preOOP.fla=====
// MovieClip: ボタンを押している間_root.my_mcを右に移動し続ける
// MovieClipアクション
on (press) {
  // フラグをオンに
  bMove = true;
}
on (release) {
  // フラグをオフに
  bMove = false;
}
onClipEvent (enterFrame) {
  if (bMove) {  // フラグがオンなら
    // 右に移動する
    _root.my_mc._x += 10;
  }
}
=====
スクリプトがすべて1カ所で把握できるのは利点。しかし、複数のボタンを設定した場合、整合性を保つことが難しい。サンプルムービーは、ボタンをクリックする順番によってMovieClipのアニメーションが変わってしまう。

2 モジュール化後
アニメーションするインスタンスに対しては、関数を呼出すのみ。具体的な処理は、MovieClipに任せる。リモコンからは信号を送り、チューナー側で実際の処理を行うのと同じ。サンプルでは、イベントハンドラメソッドを使用。

□postOOP.fla=====
// MovieClip: ボタン
// MovieClipアクション
on (press) {
  _root.my_mc.xSetStep(10);  // 移動量の設定
  _root.my_mc.xStart();  // アニメーション開始
}
on (release) {
  _root.my_mc.xStop();  // アニメーション停止
}

// MovieClip: アニメーションするインスタンス
// 第1フレームアクション
nStep = 10; // 移動量の初期値
// インスタンスの移動
function xStep() {
  _x += nStep;
}
// 移動量の変更
function xSetStep(nX) {
  nStep = nX;
}
// アニメーション開始
function xStart() {
  bMove = true;
}
// アニメーション停止
function xStop() {
  bMove = false;
}
// アニメーションの実行
this.onEnterFrame = function() {
  if (bMove) {
    this.xStep();  // インスタンスの移動
    // ステージ外に出たら反対のサイドに移動
    if (_x>Stage.width) {
      _x -= Stage.width;
    } else if (_x<0) {
      _x += Stage.width;
    }
  }
};
=====
アニメーションするインスタンスの側で実際の処理を行うので、複数の関数が呼ばれても、整合性のある動作が可能。アニメーションの修正や追加も、1箇所に集中できる。

3. イベントハンドラメソッドの削除
イベントハンドラメソッドは、削除できる。フラグを使わない、すっきりとしたスクリプティングが可能になる。

□EventMethods.fla=====
// MovieClip: アニメーションするインスタンス
// 第1フレームアクション
nStep = 10;
function xStep() {
  _x += nStep;
}
function xSetStep(nX) {
  nStep = nX;
}
// アニメーション開始
function xStart() {
  // イベントハンドラメソッドを定義
  this.onEnterFrame = this.xAnimate;
}
// アニメーション停止
function xStop() {
  // イベントハンドラメソッドをクリア
  delete this.onEnterFrame;
}
function xAnimate() {
  this.xStep();
  if (_x>Stage.width) {
  _x -= Stage.width;
    } else if (_x<0) {
    _x += Stage.width;
  }
}
=====

4. イベントハンドラメソッドのfunction切替え
イベントハンドラメソッドは、'function'の代入。代入ということは、設定する'function'を切替えることが可能。

○メソッドもプロパティ
拙著『モーショングラフィックスで学ぶActionScript―Flash MX』「4.8 メソッドもプロパティ」。

□ChangeFunctions.fla=====
// MovieClip: アニメーションするインスタンス
// 第1フレームアクション
nStep = 10;
function xStep() {
  _x += nStep;
}
function xSetStep(nX) {
  nStep = nX;
}
function xStart() {
  this.onEnterFrame = this.xAnimate;
}
function xStop() {
  delete this.onEnterFrame;
}
function xAnimate() {
  this.xStep();
  if (_x>Stage.width) {
    _x -= Stage.width;
  } else if (_x<0) {
    _x += Stage.width;
  }
}
// 減速しながら移動する
function xEaseOut(nX) {
  nTargetX = _x+nX;
  // イベントハンドラメソッドに定義する'function'を切替える
  this.onEnterFrame = function() {
    var nDistance = nTargetX-_x;
    if (Math.abs(nDistance)>=.5) {  // 目的位置までまだ距離があれば
     _x += nDistance*.2;
    } else {  // 目的位置に接近したら
      _x = nTargetX;
      // イベントハンドラメソッドをクリア
      delete this.onEnterFrame;
    }
  };
}
=====
イベントハンドラメソッドは、携帯の着メロと同じ。メモリの内容を書替えれば、いつでも自由に新曲に切換えできる。

Activationオブジェクトに、ローカル変数を保持することが可能。'function'の実行が終了しても、値を参照している間はメモリからクリアされない(『オブジェクト指向で考えるActionScript』p.139〜「Activationオブジェクト」参照)。

// 減速しながら移動する
function xEaseOut(nX) {
  var nTargetX = _x+nX;  // 値をローカル変数に設定
  // イベントハンドラメソッドに定義する'function'を切替える
  this.onEnterFrame = function() {
    var nDistance = nTargetX-_x;
    if (Math.abs(nDistance)>=.5) {  // 目的位置までまだ距離があれば
     _x += nDistance*.2;
    } else {  // 目的位置に接近したら
      _x = nTargetX;
      // イベントハンドラメソッドをクリア
      delete this.onEnterFrame;
    }
  };
}

5 MovieClipにクラス定義
ユーザー定義の独自クラスをムービークリップシンボルに設定することが可能。MovieClipを継承して作成。

□registerClass.fla=====
// クラス定義
#initclip // シンボル読込み時に実行
// コンストラクタ関数
function myMovieClip() {
  this.nStep = 10;
}
// MovieClipインスタンスを継承
myMovieClip.prototype = new MovieClip();
// メソッドを'prototype'に定義
myMovieClip.prototype.xStep = function() {
  this._x += this.nStep;
};
myMovieClip.prototype.xSetStep = function(nX) {
  this.nStep = nX;
};
myMovieClip.prototype.xStart = function() {
  this.onEnterFrame = this.xAnimate;
};
myMovieClip.prototype.xStop = function() {
  delete this.onEnterFrame;
};
myMovieClip.prototype.xAnimate = function() {
  this.xStep();
  if (this._x>Stage.width) {
    this._x -= Stage.width;
  } else if (this._x<0) {
    this._x += Stage.width;
  }
};
myMovieClip.prototype.xEaseOut = function(nX) {
  var nTargetX = this._x+nX;
  this.onEnterFrame = function() {
    var nDistance = nTargetX-this._x;
    if (Math.abs(nDistance)>=.5) {
      this._x += nDistance*.2;
    } else {
      this._x = nTargetX;
      delete this.onEnterFrame;
    }
  };
};
// シンボルにクラスを関連づけ
Object.registerClass("Pen", myMovieClip);
// メインタイムラインに残る関数を削除
delete myMovieClip;
#endinitclip
=====

6. ActionScript 2.0によるクラス定義
Flash MX 2004では、ActionScript 2.0により'class'を定義することが可能。ActionScript 2.0については、オブジェクト指向プログラミング参照。

□MyMovieClip.as(ムービーはClass.fla)=====
// クラス定義
class MyMovieClip extends MovieClip {  // MovieClipを継承
  // インスタンスプロパティの宣言
 var nStep:Number = 10;
  var nTargetX:Number;
  var onEnterFrame:Function;
  // メソッドの定義
  function xStep() {
    _x += nStep;
  }
  function xSetStep(nX:Number):Void {
    nStep = nX;
  }
  function xStart():Void {
    this.onEnterFrame = this.xAnimate;
  }
  function xStop():Void {
    delete this.onEnterFrame;
  }
  function xAnimate():Void {
    this.xStep();
    if (_x>Stage.width) {
      _x -= Stage.width;
    } else if (_x<0) {
      _x += Stage.width;
    }
  }
  function xEaseOut(nX:Number):Void {
    nTargetX = _x+nX;
    this.onEnterFrame = function() {
      var nDistance = nTargetX-_x;
      if (Math.abs(nDistance)>=.5) {
        _x += nDistance*.2;
      } else {
        _x = nTargetX;
        delete this.onEnterFrame;
      }
    };
  }
}
=====

クラスとシンボルの関連づけは、[シンボルプロパティ]の[AS 2.0クラス]にクラス名を指定する('Object.registerClass()'メソッドは、使わない)。


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