cocos2d for iPhone レッスンノートのAsteroidをkobold2dへ移してみた:その1

前回、kobold2dをインストールしてテンプレートで遊んだところ、何かいい感じだったのでkobold2dでゲーム作りを進めてみることにしました。

とは言え、cocos2dはおろかフツーにiOSのゲームを作ったことが無いので、先ずは「cocos2d for iPhone レッスンノート」という学習本で作った「Asteroid」というシューティングゲームをkobold2dで作ってみることにしました。
ソースコードをそのままAddして、いきなりRunしたら動くかなぁとやってみたのですが、予想通りたくさんエラーが出てきました。
世の中そんなに甘くないと思っていたので、kobold2dでワークスペースとプロジェクトを作って、本に書かれた順番でAsteroidを入力していきます。
そうすれば、エラーが出るにしても少しずつ出てくれるので、一度に対処しなくて済みそうだからです。でも、それでも簡単には行きませんでした。

130406 0002
まず最初に、軽いジャブ(エラー)を食らいます。

130406 0001
kobold2dでは、Resourcesグループに入っているconfig.luaという設定ファイルのFirstSceneClassNameで最初に読み込むクラスを指定するようです。デフォルトでHelloWorldLayerが入っていたので、Asteroidの最初のクラスであるGameSceneを入力しておきました。

130406 0003
次は解像度です。
kobold2d v2ではRetinaがデフォルトなようで、Asteroidで作った素材をそのまま使うと幅が半分の大きさになってしまいました。
地面も半分なので何だか分かりません。

130406 0005
そこで、地面の素材をRetina対応かつ面倒なので自分のiPhone5に適応した1136pxで作成しました。
ついでに、DotTouchというiPhoneのドット絵エディターアプリを入手していたので、自機もドット絵の練習で描いてみました。

130406 0006
次は、流れて行く星空を表現した背景が表示されませんでした。
本当は、解像度よりも先に遭遇したトラブルだったのですが、単なる背景なので別にパーティクルでなくても良いやと放置していました。
で、最初はkobold2dで使うCCParticleSystemには何か特別な方法が必要なのかなと思ったのですが、fire.png画像をAddしていないだけでした。これは、本のp.210にしっかり書いてあるので解決できました。

130410 0001
そして最初にハマった大きめのトラブルは、タッチイベントでした。
最初は、タッチの書き方が悪いのではないかと疑いました。確かに、[CCTouchDispatcher sharedDispatcher]という書き方は非推奨で、[[CCDirector sharedDirector] touchDispatcher]と書かないとdeprecatedとWarningは出ました。でも、ここを直しても全くタッチに反応しません。
そこで、各所にNSLogを仕掛けまくり、デバッガでブレークポイントを仕掛けまくりました。結果、タッチした直後は動かす指示が入るのに、それがswitch判定の所に来ると止まる指示に勝手に戻ることが分かりました。
原因が分かったものの、どう直したら良いか全く分かりません。仕方なく関係するものを根拠無しにいろいろ試したところ、指示を決めるCanon.hのMovingState state;を@ interface Canon : CCNodeの外に出したら動きました!
変数のスコープがcocos2dとkobold2dで違うのでしょうか。。。分かりません。

で、動いたのですがタッチの範囲が地面の素材land.pngの大きさにしかなりません。
これにも躓きました。苦し紛れに思いついたのは、画面全体の大きさと同じ黒背景をGameScene.mのinitでaddしてみることでした。
これは上手くいき、画面のどこをタップしても反応するようになりました!

こんな感じで前途多難ですが、暫くは少しずつ解決しながら次へ進んで行くことにしました。