開発日誌

開発進捗など

Observer パターンの実装

以前に作りかけだったRPGでは
cocos2d::Spriteを保持するインスタンス(View)とキャラクタのデータ(Model)を分けて、
キャラクタのデータの方はフィールド画面でも戦闘画面でも使うものとして作っていました。

ここで Observer パターンを使い Model を Observable、View を Observer として、
データに変更があれば見た目も変わるようにしていました。
例えばキャラクタが死んだら棺桶の表示になるとか。

ところが、View の方は、マップ全体での位置座標から画面上での座標に変換して Sprite へ値を設定する関係上、
カメラ(マップ上のどこを画面に表示しているかの情報を保持する)の Observer にもなる必要が出てきましたが Model の Observer と Camera の Observer とで継承メソッドのシグネチャがバッティングして 困りました(その時はそれぞれに独自のクラスを作り、それぞれのインスタンスを持つことで解決しました)。

今回は template を使って Observer クラスを定義することで、
複数の Observer を継承できるようにしてみました。 また、weak_ptr を使って参照を保持しているので、通知解除せず Observer が死んでも 問題なく動くようにできました。

以下がコードです。
(記事タイトルをクリックして詳細を見ないと見えないようです)