Observer パターンの実装
以前に作りかけだったRPGでは
cocos2d::Spriteを保持するインスタンス(View)とキャラクタのデータ(Model)を分けて、
キャラクタのデータの方はフィールド画面でも戦闘画面でも使うものとして作っていました。
ここで Observer パターンを使い Model を Observable、View を Observer として、
データに変更があれば見た目も変わるようにしていました。
例えばキャラクタが死んだら棺桶の表示になるとか。
ところが、View の方は、マップ全体での位置座標から画面上での座標に変換して Sprite へ値を設定する関係上、
カメラ(マップ上のどこを画面に表示しているかの情報を保持する)の Observer にもなる必要が出てきましたが
Model の Observer と Camera の Observer とで継承メソッドのシグネチャがバッティングして
困りました(その時はそれぞれに独自のクラスを作り、それぞれのインスタンスを持つことで解決しました)。
今回は template を使って Observer クラスを定義することで、
複数の Observer を継承できるようにしてみました。
また、weak_ptr を使って参照を保持しているので、通知解除せず Observer が死んでも
問題なく動くようにできました。
以下がコードです。
(記事タイトルをクリックして詳細を見ないと見えないようです)