Memorandum

自分へのメモ。そして誰かの役に立てば、うれしい。

cocos2d-xでゲームを作ろう! 第六回 マップスクロール2編

さて、ちょっと日が開いちゃいましたが、はりきってまいりましょう。

ちなみに、GitHubにコードを登録しましたー。今後はココに修正コードをコミットしていきますので、参考にしてもらえると嬉しいです。
keizi/RPGTest · GitHub

設定する際は、以下のサイトを参考にさせて頂きました。ありがとうございます。
XcodeからGitHubのリポジトリを使う方法 | UQ Times 開発の記録

大変分かりやすくて、なんにも分かっていない自分でも、特にハマる事はありませんでした。これで、XCodeからもコードコミットが簡単にできるし、ソース管理されているとスゴく安心ですね。あと、Gistでコード断片を貼付けていこうと思いますので、少しは見やすくなるかなと思います。

マップをズルズル動かしてみよう!

前回は、タッチイベントを受けるところと、setPosition()で座標を設定するところまででしたが、今回は、マップをズルズルと動かしてみたいと思います。
まずは、以下のコードを参照してください。
マップズルズルスクロール

大まかにやっていることとしては、

  1. 現在のマップの座標を取得して
  2. 移動したい方向に座標を加算して
  3. 加算分の移動をアクションで実行する!

ってな感じです。

このコードは、

void HelloWorld::update(float delta)

に書きます。この処理を一定間隔でコールされるようにスケジュールを設定しておきます。

スクロールの方向を制御しよう!

さて、今回はスクロールすることを実現しようと思っているので、あまり難しい制御はしません。(っていうかできません)考えているのは、以下のタッチ領域を触り続けると、その方向にキャラクタが進んでいくようなイメージです。
f:id:Keizi:20130914162019p:plain

スクロール方向を決定しよう!

タッチイベントにて、どの方向にスクロールするかですが、以下のようにゴリゴリと書いてしまいました。はずかしー。
向き判定処理

少し説明すると、

  1. タップした座標が中心からどの辺りにあるか調べて
  2. 縦方向、横方向どちらが長いかで進む方向を決定して
  3. 格納していたアニメーションを取り出して、キャラクタの向きを変えて
  4. update()が定期的にコールされるように設定して
  5. まずは、歩き出す方向のアクションをマップに適用します

こんな感じでしょうか。
で、終わるのはタッチイベントが終了したときなので、

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    CCLOG("ccTouchEnded");
    this->unschedule(schedule_selector(HelloWorld::update));
}

としてます。タッチイベントが終了したら、スケジュールをキャンセルします。

とりあえず、ここまでのコードをgithubへコミットしてあるので、お暇な方は見てみてください。色々と意見をもらえると嬉しいです。ちなみに、iOSでしか動作確認してませんが、Androidでも動くはず。。。たぶん。。。おそらく。

自分は、バーチャルキーがちょっと苦手というか、画面が塞がれるのがいやだなぁーというのがあって、こういう感じの操作方法を考えました。ただ、実際にやってみると、これはこれでいけてないな、というのに気づきました。上に移動するときに、上をタップするのは気持ち悪いですね。ウィンドウとかも表示するだろうし。あと、横持ちを想定していましたが、スマホの場合縦の方がよさそうですね。片手で操作できると持ってよいですよね。電車とかでつり革をもっててもできるし。

ちょっと駆け足で進んでしまいました。いろいろと説明を端折るとこもありますが、私自身も試行錯誤して理解できていない部分もあるし、そもそも、ソースが汚い!あと、もっとちゃんと設計をしてから取り組みたいというのもあります。まだ、サンプルのまんまのソースコードをいじってますしね。色々とやりたい事もあるので、次回も頑張ります!