cocos2d-xでゲームを作ろう! 第六回 マップスクロール2編
さて、ちょっと日が開いちゃいましたが、はりきってまいりましょう。
ちなみに、GitHubにコードを登録しましたー。今後はココに修正コードをコミットしていきますので、参考にしてもらえると嬉しいです。
keizi/RPGTest · GitHub
設定する際は、以下のサイトを参考にさせて頂きました。ありがとうございます。
XcodeからGitHubのリポジトリを使う方法 | UQ Times 開発の記録
大変分かりやすくて、なんにも分かっていない自分でも、特にハマる事はありませんでした。これで、XCodeからもコードコミットが簡単にできるし、ソース管理されているとスゴく安心ですね。あと、Gistでコード断片を貼付けていこうと思いますので、少しは見やすくなるかなと思います。
マップをズルズル動かしてみよう!
前回は、タッチイベントを受けるところと、setPosition()で座標を設定するところまででしたが、今回は、マップをズルズルと動かしてみたいと思います。
まずは、以下のコードを参照してください。
マップズルズルスクロール
大まかにやっていることとしては、
- 現在のマップの座標を取得して
- 移動したい方向に座標を加算して
- 加算分の移動をアクションで実行する!
ってな感じです。
このコードは、
void HelloWorld::update(float delta)
に書きます。この処理を一定間隔でコールされるようにスケジュールを設定しておきます。
スクロールの方向を制御しよう!
さて、今回はスクロールすることを実現しようと思っているので、あまり難しい制御はしません。(っていうかできません)考えているのは、以下のタッチ領域を触り続けると、その方向にキャラクタが進んでいくようなイメージです。
スクロール方向を決定しよう!
タッチイベントにて、どの方向にスクロールするかですが、以下のようにゴリゴリと書いてしまいました。はずかしー。
向き判定処理
少し説明すると、
- タップした座標が中心からどの辺りにあるか調べて
- 縦方向、横方向どちらが長いかで進む方向を決定して
- 格納していたアニメーションを取り出して、キャラクタの向きを変えて
- update()が定期的にコールされるように設定して
- まずは、歩き出す方向のアクションをマップに適用します
こんな感じでしょうか。
で、終わるのはタッチイベントが終了したときなので、
void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { CCLOG("ccTouchEnded"); this->unschedule(schedule_selector(HelloWorld::update)); }
としてます。タッチイベントが終了したら、スケジュールをキャンセルします。
とりあえず、ここまでのコードをgithubへコミットしてあるので、お暇な方は見てみてください。色々と意見をもらえると嬉しいです。ちなみに、iOSでしか動作確認してませんが、Androidでも動くはず。。。たぶん。。。おそらく。
自分は、バーチャルキーがちょっと苦手というか、画面が塞がれるのがいやだなぁーというのがあって、こういう感じの操作方法を考えました。ただ、実際にやってみると、これはこれでいけてないな、というのに気づきました。上に移動するときに、上をタップするのは気持ち悪いですね。ウィンドウとかも表示するだろうし。あと、横持ちを想定していましたが、スマホの場合縦の方がよさそうですね。片手で操作できると持ってよいですよね。電車とかでつり革をもっててもできるし。
ちょっと駆け足で進んでしまいました。いろいろと説明を端折るとこもありますが、私自身も試行錯誤して理解できていない部分もあるし、そもそも、ソースが汚い!あと、もっとちゃんと設計をしてから取り組みたいというのもあります。まだ、サンプルのまんまのソースコードをいじってますしね。色々とやりたい事もあるので、次回も頑張ります!