OOPで考えるActionScript Step02





this is flash contents.

■Step02 ~自分のことは自分で編~

ソース

自分のことは自分でやる」ということは
そのスクリプトの書いてある位置が特定し易くなる.
先の例ではプレーヤーがジャンプするスクリプトの実装が
コントローラーに書かれてしまっている.

/**
* 押された際にキャラクターをジャンプさせる.
*/
this.onPress = function() {
  // キャラクターがノーマルの場合のみ処理する
  if (_root.mario_mc.status == 'normal') {
    // キャラクターをジャンプさせる
    _root.mario_mc.gotoAndPlay('jump');
    // ジャンプの回数を増やす
    _root.count_txt.text = Number(_root.count_txt.text) + 1;
    // キャラクターの状態を変更する.
    _root.mario_mc.status = 'jump';
  }
};

gotoAndPlay()メソッドを使っているということはコントローラーが
プレーヤーのジャンプする実装がフレームで実装されているのを知っていることになる.
なぜコントローラーがプレーヤーの操作を直接行うことがよくないのか?それは,

・コントローラーの実装とプレーヤーの実装を違う人が行う場合に
 十分なコンセンサスを取る必要が出てきてしまう.
・プレーヤーの実装が変わった場合にコントローラーの実装も変えないといけない.
 (この場合ジャンプの実装がスクリプトで制御する可能性がある.)

んじゃ,どーすんのよってことだけど自分に関することは
自分で実装して,そのきっかけとなるもの(メソッド)を外部に公開してあげる

ことができればいいですよね.
これが先に行っていた「自分のことは自分でやる」ということになる.
先のコントローラーに書かれていたスクリプトをプレーヤ側に移動すると.

[_root.mario_mc]

/**
* キャラクターのステータスを表す.
*/
var status;

/**
* ジャンプする.
*/
this.jump = function() {
  if (this.status == 'normal') {
    // キャラクターをジャンプさせる
    this.gotoAndPlay('jump');
    // ジャンプの回数を増やす
    _root.jumpCount_mc.countUp();
    // キャラクターの状態を変更する.
    this.status = 'jump';
  }
};

としてあげてコントローラー側には

[_root.controller_mc]

/**
* 押された際にキャラクターをジャンプさせる.
*/
this.onPress = function() {
  _root.mario_mc.jump();
};

と,呼び出すだけになるから非常にシンプルになる.
これで,プレーヤーがジャンプ中なのかどうかも気にせずに
コントローラーはプレーヤーのjump()メソッドを呼び出せば(・∀・)イイ.

これで,スクリプトの書く場所がどこにあるかが分かり易くなった.
ただ,これではデザイン(Flash上のデザインやアニメーションのオーサリング)と
スクリプトがIDE上で混在したような形になっている.
macromediaでは1フレーム目にスクリプトを書くことを推奨したスタイル
としている.(この手法に関する良し悪しは置いておいて.)
こうすることによってスクリプトの場所とデザインの場所を分別できる.

んじゃ,1フレーム目にスクリプトを移動するのはどんな方法を使うのか?
それがクラス定義とObject.registerClass()メソッドを使う方法になる.

リスト
■Step00 ~序章~
■Step01 ~とにかく実装編~ソース
■Step02 ~自分のことは自分で編~ソース
■Step03 ~クラス定義とObject.registerClass()~ソース
■Step04 ~MVCを意識して~ソース
■Step05 ~Mediatorパターンを取り入れる~ソース
■Step06 ~AS2.0に書き換える~ソース


contributor nao : 2005年10月03日 01:50

trackback

trackback for this entry URL:
http://blog.graffiti-web.org/mt/mt-tb.cgi/321

comment

comment is here.




保存しますか?