ヤミからの逃走

ヤミからの逃走というゲームを作った。 今回はiOSとAndroidの両方で遊べます。

洞窟にやってきた冒険者があぶないヤツに出会ってしまい、暗い中逃げ回りつつ宝物を拾っていくというストーリーです。 画面を指でなぞるとキャラクターが左右に動きます。 スタミナが切れるとゲームオーバーです。 ちくわやきのこなどをひろうとスタミナが回復します。 なんか緑色のポヨポヨしたやつにぶつかるとスタミナが減ります。

スクリーンショット1 スクリーンショット2

GameCenter や Google Play Game Services に対応しています。 スコアランキングで上位を目指したり、実績解除に挑戦してみてください。

iOS : ダウンロード
Android: ダウンロード


作ってるときに思ったこととか

作ってる時に思ったことをずらずらと書いてみる。

開発期間

画像や効果音の作成、Android 関連の実装を妻に手伝ってもらった。ありがとう。 最初のデモ版を作ったときから合わせると2ヶ月くらいかかった。 そんなにボリュームがあるゲームじゃないのに。だいたい FF14 が原因だったりする。 公開できるか怪しい時期もあったけど、なんとかなった。

言語とかフレームワークとか

前回エクストリームもも・きのこ狩りを作った時に使った cocos2d-iphone が楽だった。 今回は、同じような感じでiOSとAndroidの両方に対応できるか試してみようと、cocos2d-x を使ってみた。 cocos2d-x は cocos2d-iphone とちがい、開発言語に Objective-C ではなくC++ を使う。 C++ は書いたことがなかったので見よう見まねで適当に書いた。ひどいことになっているかもしれない。

cocos2d-x は cocos2d-iphone からきているせいか、すごく Objective-C っぽいところが見られた。 retain とか autorelease などのObjective-Cっぽいメソッドが用意されてる。 CCObject とか CCArray みたいな Objective-C 書いたことある人ならああアレねって思うようなクラスもたくさんある。 なので、Objective-C にそれなりに慣れていたり、cocos2d-iphone を触ったことのある自分には、とてもやりやすかった。

cocos2d の機能とか

前回つかわなかったcocos2dの機能をつかってみた。

パーティクルシステム

パーティクルは ParticleStudio をつかって作成した。 このソフトでエフェクトをみながらパラメータをいじって、cocos2dアプリケーションで読み込める形式のplistファイルを出力して使った。 パーティクルはアイテムを取った時の星やキャラクターの足元に出る砂煙などにつかった。 ちょっとしたエフェクトをつけるだけでぐっとゲームらしくなった。 あんまり使いすぎるのもよくないのだろうけど。

スプライトシート

スプライトシートの作成には Zwoptex を使った。

スプライトシート

Zwoptex は画像リソースをひとまとめにしてくれるアプリケーションだ。 Zwoptex で複数の画像ファイルをまとめて、cocos2d の sprite frame として追加しアプリケーションで使う。 画像リソースの管理が楽になるし、透過を指定している余計な余白を省いて敷き詰めてくれるのでファイルサイズを節約できる。 使う時も、直接画像ファイルを指定するやり方とほとんど変わらないし、ひとつひとつの画像を読み込んで使うより高速らしい。いいことだらけだ。 Retina用の画像も自動で出力するようなパブリッシュの設定をして使った。

iOS と Android の両方対応するために

コードは Xcode で書いて、 iOS シミュレータで動作を確認しながらゲームを作った。 ある程度できてから Android の開発環境を構築してビルドしたらあっけなく動いてしまった。 ひとつのコードで iOS と Android の両方に対応するゲームが作れるのはすごくありがたい。 細かいところで OS ごとに面倒をみてあげる必要があるのだけど、ゲームのロジックや画面が同じようにさくっと動いてしまうのは大きいと思う。

iOS/Android の両方に対応する上で悩んだのはセーブデータをどのように保存するかだった。 CCUserDefaults という iOS でいう NSUserDefaults みたいなクラスがあって連想配列のようにデータを記録できる仕組みがあったのだけど、結局 sqlite を使った。この選択が正しかったかどうか考えると、ちょっと微妙だったかもしれない。 そんなに保存するデータはないし、あんまりRDB的な使い方をしていない。 SQLを生で書きたくないなあとC++で使える手軽なライブラリをさがしたのだけど、しっくりくるものが見つけられなかった。

iOS では動くけど Android では動かない、みたいな問題に数回遭遇した。 原因はファイルのパスが予期しないものになっているとか、型変換があやしいことになっていたけどiOSではなぜか動いちゃってたとか、しょっぱい問題だったんだけどAndroidでエラーを追いにくかったので時間がかかってしまった。NDKを使った時のデバッグ術をもう少し勉強しないとだめそうだ。

スコアランキングと実績

スコアのランキングと実績の機能を追加するために、iOS には GameCenter、Android には Google Play Game Services が用意されている。 Google Play Game Services の方は比較的あたらしめのサービスのせいかあんまり情報が見つけられなかった。 ちょっと、デベロッパーコンソールの動きが怪しかったりエラー内容がわかりにくいのが気になった。 データをポストする部分はJavaで書かないといけないのでjniで呼び出すことになった。

OSごとに違うサービスを使うことになるので、ここだけ実装が分かれている。 Google Play Game Services は iOS でも使えるはず、と思ったけど、まあ iOS ユーザは GameCenter のほうが楽だよねってことでそれぞれのサービスを使うようにした。 ランキングがわかれちゃうのは残念なんだけど。

画面サイズ

画面サイズは4インチのiOS端末だけ特別に縦長で、ほかは320x480固定にしている。タブレット端末でも引き伸ばしてる。 画面サイズに合わせて描画できなくもないのだけど、今回のゲームの内容だとプレイに差がついちゃうのかなと思って統一してしまった。

その他

本当はもうちょっといろんな要素を加えて、より楽しく遊べるゲームにしたかったのだけどキリがないのでこのように落ち着いた。 パワーアップアイテムとかゲームの戦略が増える要素をいれたかったけど、さっさと公開してしまいたかったのであきらめた。 どこまでやるか考えるのは難しい。 その気になったらOUYAに対応させるかもしれない。

ソースコード: https://github.com/slightair/yamiHikariGame

次回

次は85円でも買ってもらえそうなゲームを作ろう