フィールドキャラクタのビュー
フィールドキャラクタのビューを実装しました。
画面上にキャラクタを表示する「キャラクタビュー」は既に実装済みなので、
キャラクタビューを継承するだけでキャラクタの見てくれやアニメーションの部分は完了。
これにフィールドマップ上の位置という要素を加えます。
このクラス特有の、フィールド上での位置は、いずれはモデル(ドメイン)の方に置く予定ですが ひとまずはメンバ変数として保持するよう実装しました。
このビュー(の基底クラスのキャラクタビュー)自体は cocos2d::Sprite を基底クラスとしているので、表示座標の設定は setPosition() を用いて画面座標を指定することで行います。
ただし、画面上のどこに表示されるかはあくまでもこのキャラクタのフィールド上での位置とカメラの位置から決まるため、このクラス(インスタンス)の所有者がsetPosition() を直接呼び出すことはしません。
そのためにこのクラスは既作成のカメラクラスのインスタンスをコンストラクタで受け取り、そのリスナとして自身を登録します。
カメラの移動通知を受けて自身のフィールド上の座標と差し引きして自身の画面座標を更新します。
注意するのは、フィールドの座標系は左上原点の右下方向がプラスとなるようにしていますが、 cocos2d-x の画面座標系は左下原点で右上方向がプラスであること。
そのためフィールド座標でのカメラとキャラクタの差はY方向だけ反転した上で、カメラ位置を画面の中心に持ってくるため画面サイズの半分をxとyそれぞれ足して画面座標を更新することになります。
このキャラクタを動かすにはフィールド上での位置を変更するために作成した setFieldPosition() を呼びます。
フィールド上での位置を表す変数がいずれモデル側に移動したら、このメソッドもモデル側に移動し、
ビューへ直接位置を設定する機能はなくなるでしょう。
これでカメラを操作するとキャラクタが離れていく(フィールド上の特定の位置に固定されている)ようになりました。
フィールドマップ用カメラの実装
フィールドマップを映すカメラを実装した。
とは言っても2Dのゲームなので注視点(=カメラ位置)を表すマップ上の座標をひとつと、通知先の配列を持っているだけ。
機能としては、注視点が変更された際に、登録されているリスナーの notify() を呼び出す。
また、フィールドマップのビュー(作成済み)の方でこのカメラのリスナを継承(インターフェースを実装)して、
カメラ位置に応じて中のチップ及びチップのオフセットが変わるよう修正した。
これでカメラを動かすだけでマップがその位置を中央としてスクロールするようになった。
次はマップ上の座標を持つキャラクタービューを作成する予定。