asatoの技術的な日常日記

「成長に最大の責任をもつ者は、本人であって組織ではない。自らと組織を成長させるためには何に集中すべきかを、自らに問わなければならない」  非営利組織の経営 - ピーター・ドラッカー

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アスペクト指向デザイン:BGMコンサーン

アスペクト指向プログラミングは、横断的なコンサーンをモジュール化することを目的としています。ここまでは一般的な話なので、情報元を示せ!とかやめて。


Java というか AspectJ でゲーム作ってるわけだけど、BGM って横断的コンサーンな気がした。さらに、フィーチャでもある気がする。

BGM なので、「タイトル画面」での曲とか、「ゲーム中」の曲とか、「
ゲームオーバー」の時の曲とか、そういうゲームの状態に依存して、鳴る曲が決まる。

フィーチャであるとは、たとえば、BGM がないゲームをリリースすることもあるかもしれない。まあ、オン・オフに切り替えるのが妥当だと思うけど。


以下は実例。オブジェクト指向の場合の実装を考えてないので、比較はまだできてない。


public class GameManager {

...

private GameMode gameMode = GameMode.OPENING;

public enum GameMode { OPENING, NORMAL, PLAYER_DOWN, GAME_OVER, ENDING };

public GameMode getGameMode() {
return gameMode;
}

public void setGameMode(GameMode gameMode) {
this.gameMode = gameMode;
}

....
}
public aspect MusicManagement {

...

// ゲームモードが変わったら、BGM変更
after(GameMode mode) :
args(mode) && set(GameMode GameManager.gameMode)
{

if (mode == GameMode.OPENING) {
// ... BGM 変更
}
else if (mode == GameMode.NORMAL) {
// ... BGM 変更
}
else {
// ...
}

}
...
}




ちゃんと分析はできてない(以下のコードはコンパイルすら検討してない)けど、通常のオブジェクト指向の考えだと、たとえば、
public void setGameMode(GameMode gameMode) {
this.gameMode = gameMode;
// ここでBGM変更
}
みたいになるんじゃないかと思う。

もっと GameManager と BGM のコンサーンを分離したいなら、リスナーor Observer を導入することになると思う。

  public void setGameMode(GameMode gameMode) {
   this.gameMode = gameMode;

   fireGameModeChanged(...); // リスナーに通知
  }

public class BGMManager implements GameModeListener {
 public void gameModeChanged() {
  // BGM 変更
 }
}

あるいは、XPI (Crosscutting Programming Interface) のアプローチ(PDF)っぽくすると

public aspect XGameModeChange {
 public pointcut change(mode) : args(mode) && set(GameMode GameManager.gameMode);
}
public aspect MusicManagement {
 after(GameMode mode) : XGameModeChange.change(mode) {
  // ...
 }
}
みたいになるきがする。

めんどくさいけど、いつものごとく DSM で一応確認してみる。
bgm


なかなか興味深い。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://asatohan.blog77.fc2.com/tb.php/11-a8447598
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。