OOPで考えるActionScript Step04





this is flash contents.

■Step04 ~MVCを意識して~

ソース

コントローラ部分をMVCに分けてみよう.
といってもMはないのでVCだけ.:P
まずはViewの部分を見てみよう.

ボクのなかでViewの定義は


・表示を司る機能を持つ
・イベントハンドラをもちController側からそのイベントハンドラを上書きできる

と考えているので,この例で言うとコントローラーのAボタンが押された
pressAというイベントハンドラを持つことにした.

/**
* ゲームのコントローラーのViewとなるクラス.
*
* @author  nao seto <setog@graffiti-web.org>
*/

/**
* コンストラクタ.
*
* @return  Void
*/
_global.study.ControllerView = function() {
  /**
  * ジャンプボタン.
  *
  * @param  MovieClip
  */
  this.buttonA_mc;
  
  /**
  * Aボタンが押されたときに呼ばれるカスタムイベントハンドラ.
  *
  * @param  Function
  * @description  コントローラー側から上書きされる.
  * @return  Void
  */
  this.onPressA;

  this._init();
  
  var objControl = _global.study.ControllerControl.getInstance();

  objControl.setView(this);
};

/**
* MovieClipを継承.
*/
_global.study.ControllerView.prototype = new MovieClip();

/**
* 初期化処理.
*
* @return  Void
*/
_global.study.ControllerView.prototype._init = function() {
  var target = this;

  this.buttonA_mc.onRelease = function() {
    target.onPressA();
  };
};



// シンボルに割り当て
Object.registerClass('controller', _global.study.ControllerView);

ここでonPressAbuttonA_mconPressしたときに
呼び出されるカスタムイベントハンドラとなっている.
このViewの中ではこのカスタムイベントハンドラには何も設定していない.
つまり,このViewをコントロールするController役がそのイベントハンドラに対して
そのコンポーネントに合う挙動を設定してあげています.
んで,その設定しているControllerでイベントハンドラを設定しているところを
見ると.

[Classes]->[ControllerControl]

/**
* Viewに対してイベントハンドラを設定する.
*
* @return  Void
*/
_global.study.ControllerControl.prototype._setEvent = function() {
  this._objView.onPressA = function() {
    _root.mario_mc.jump();
  };
};

ここでプレーヤーのジャンプを叩くように設定してある.

しかしよく見ると_rootなどのパスの指定が
いたるところに見られる.
特にMovieClipの絶対パスの指定や,直接の座標などの数値の指定は再利用性
なくなってしまうので極力避けたい.

座標などの情報はデザインのレイアウト情報に当たるものが多いので数値を直接指定するのではなく
極力ダミーのMovieClipなどを配置してそこから取得するなど工夫をするほうがメンテナンス性や
再利用性があがると思われ.

んじゃ,MovieClipにたいするパスの指定はどうするの?ってことだけど
簡単に言うとコンストラクタを利用して自身のインスタンスが格納されたパスを
どこかへ保存する.

次はその辺を取り入れてみよう.

追記)2005.10.03 13:56
ちなみにMVCとは(一般的に言われているものに私的な意見も加えています.間違ってたら突っ込み入れてください)

M : Model
 デザインや設計などに影響されない1つの事象に対するデータを集めたもの.
基本的にはGetter,Setterのみをメンバーとして持つ.
(通信などの仕組みをModelに入れているケースを見かけたことがあるけど,これはよく言われるMVCの定義からするとNGだと思う.というのはデータの取得元が変わったらMの変更が必要になっちゃうから... とはいえ,ありえなくはないと思うけど(どっちだよ.))

V : View
 (上のほうにも書いてあるけど)デザインに影響する部分を司り,イベントを発行する役割.
何かしらのイベントが起こった場合にそのイベントに対して自身も処理しなくてはならないこともある.(この場合だとボタンがへこむアニメーション.)それプラスそのイベントの発行が行われたことに対する周りが行うことが出てくる.これはController側でイベントハンドラを上書きして何をするかを決めることによってC-Vとの関係性を薄くして,置き換えが可能になる.
イベントが起こった際に自身が行った方がいいのか,Controller経由で行った方がいいかの判断は結構センスがいるのかもしれない.(この場合ボタンをクリックするれば必ずボタンはへこむのでボタンのラベル[_down]を使っている.)

C : Controller
 VとMを保持し,取りまとめる役.大雑把に言うとVとMがやってくれないことをやる…(違うか…).一番どう設計するかのキーになるところ.とくにFlashは非同期な通信やユーザー任せのイベントが発行されるためこのあたりの設計は重要であり難しいなぁと思う.

とか,長く書いたけどこれは基本だと思うのであまりとらわれすぎるとおもしろい発想が出なくなるかも.

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


contributor nao : 2005年10月03日 02:24

trackback

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

comment

comment is here.




保存しますか?