Cocos2d-x(v3)を使って個人ゲームを開発した話

カビDON_large

はじめまして。2013年6月に勤めていた会社を退職しフリーのゲームディベロッパーとしてゲームアプリを開発を始めました。

第一弾は、ショットパズルゲーム「カビDON」をCocos2d-x v3を使って作成。
この記事では開発作業についてのおおまかな概要についてお話したいと思います!

本記事をオススメしたい方

  • Cocos2d-xの採用を検討中の人
  • ゲームアプリ作ってみたいけど開発作業の概要が知りたい人
  • v2系を使ってるけどv3系での事例が知りたい人

より具体的なトピックは次回以降のブログでお伝えしていきます。

どんなアプリ?

物理エンジンを使ったステージ攻略型のショットパズルゲームです。
良ければダウンロードをお願いします!

 

始める前の開発スキルは?

自分はFlasher/UIデザイナーだったので、どちらかというとデザインよりのディベロッパです。
なのでコーディングであったりUI組みといったフロントエンドの中でもデザインよりのスキルのほうが長けていると思います。
当然使っていた言語もjsやAS3などでした。

ちなみにスマホのネイティブアプリは触ったことはありましたがAdobe Airを使った簡単なツールアプリでしたので
iOS/Androidともにあまり知識は深くありません。
ただしObjective-Cについては大昔に何度か触ったことがあったので書き方が分かるくらいの知識はありました。

スケジューリングは?

勉強期間も含め大体3ヶ月ほどです。

5月頃:勉強期間

前職の有休期間にC++の勉強、Cocos2d-xの勉強を主にしてました。
この頃はv3系の正式リリース前だったのでv2.23を使用していました。
Cのメモリ管理、C++の書き方、Cocos2d-xの基本的なAPIの理解、Box2Dの理解を1ヶ月半ほど使って行いました。

6月中旬頃:v3への移行とネイティブ地獄

CCを打つ自分に耐えられなくなって(笑)v3系へ移行しました。
それから、主に広告実装のネイティブ連携にひぃひぃ言ってました。
いくら簡単と言えども、同じ処理を2回書く工数は馬鹿になりませんね…。

7月:ステージ作成とレベル調整、リリース準備

この頃になるとv3にも慣れハマることは少なくなりましたが
今までおざなりにしてきたゲームデザイン部分に泣かされました。
またリリース周りの作業も、結構馬鹿になりません。

作業内容の概要は?

ゲームの内容抜きにして、1通りの作業はやったかと思います。
箇条書きにすると以下の通りです。

  • 広告実装(バナー/アイコン/オファーウォール)
  • ネイティブ連携(JNI/Objective-C++)
  • Twitterシェア
  • プッシュ通知
  • Luaバインディング(本番アプリでは使用しませんでしたが…)
  • CocoStudio連携
  • 海外配信のためのローカライズ作業(日本語/英語)
  • 物理エンジン(Box2D)の使用
  • アイコン/スプラッシュスクリーンなどのリリースに必要な作業
  • パーティクル表示
  • TestFlightでのAdHocを用いた開発

で、Cocos2d-xって実際どうなの?

↑を見てもらえれば分かる通り、メモリ管理すらまともにしたことのない自分が
3ヶ月かければゲーム1本作れるくらい面倒なことを吸収してくれる素晴らしいフレームワークだと思います。
実行速度も文句なしです!

メモリ管理が楽

Cocos2d-xではAPIの中で使用するオブジェクトのメモリをObjective-Cなどで採用されているリファレンスカウント方式で管理しています。
そのためC++のnew/deleteによるメモリ管理をある程度自動で行ってくれます。
たとえばSpriteを作成してaddChildでノードに追加すれば、その間はメモリを確保してくれ、ノードから除かれた際に自動で解放してくれます。
retainやreleaseメソッドを呼べば、自分で管理することも可能です。

APIを通さないオブジェクトでは、従来通りnew/deleteをする必要がありますが
確実にメモリを確保/解放したい、という処理もあったりするので「面倒なことから解放されたいけど、制御するとこはしたい」という
仕様のバランス感がとても気に入ってます。

ガベージコレクションは不要になったら確実に参照をなくすことに気を配らないとメモリリークの要因になり、意外に見つけにくかったりするので
自動が全て良いかというと、そうでもない一面もあったりするのかな、と思ってます。

各ターゲットプラットフォーム毎にプロジェクトが生成される

普通、クロスプラットフォーム系のフレームワークは推奨されているIDEでの開発が出来ないことが多いです。
プラットフォームに依存度が高い作業においてXCode・Eclipseでの作業手順はごろごろ情報があるんだけど
これをフレームワーク上でやるにはどうしたら…みたいなケースも多く
非常に簡単そうな作業なのにいちいち海外のフォーラム漁って情報を探し、フレームワークのビルド処理の深い部分を書き換える…
なんてことも良くあります。

Cocos2d-xでは各ターゲット用のプロジェクトが作成されるので推奨IDEでアプリを実行することができます。
なので比較的楽に作業手順を見つけることができます。

逆に言えば、同じような作業を対応プラットフォーム数だけやらなければいけないので
これについては賛否両論あるかもしれません。

ネイティブ連携が楽(ただし…)

iOSではそもそもObjectiveC++でC++を混在させることが可能です。
なのでiOSのライフサイクルやUIKitなんかに精通してれば、実装コストはかなり低いのではないでしょうか。
Androidは若干面倒です。
JavaではJNIという仕組みを使ってC++とJavaを連携させます。
なので、C++側でJavaのメソッドを呼ぶグルーコードを作成する必要があります。
それでもCocos2d-xのAPIでJNIを簡単に呼べるメソッドがあったりするので、随分楽です。

ちなみにAndroidではCocos2d-xは別スレッドで動作しているので
UI絡みの処理はActivityにあるrunOnUIThreadを使います。

ありがちな拡張機能用のプロジェクトをわざわざ作成して手順を踏んでライブラリ化して組み込む…
みたいな作業しなくて良いので結構気軽にできます。

ただしやっぱり同じ処理を複数回書くのはモチベーションが下がります。
次のアプリで使い回しできるようにしたりして極力減らした方が健全です。

情報がそこそこある&交流が活発

やはり情報が多いのはいいことですね。

ツールの選択肢が多い

他のフレームワークのことはちょっと分かりませんが、結構ツールの選択肢は多いように感じました。
ツールについては後述します。

APIがASライク

ASを使ってた身としてはaddChildやaddEventListenerになじみがあるので、ノードツリーによる描画要素の制御が出来たのは大きかったです。

v3系ってどうなの?

ゲームとして一般的なことをしてるのでv3独自のハマりどころは
ttfのラベル文字列を動的に変更した時に表示がおかしくなったことがあったくらいでしょうか。
その他は何の問題もなかったように思います。

ただパッケージが変更になってたりしてヘッダファイルの場所が分からなかったりはしました。
あと異常に「cocos2d-x xxx 3.0」とググる回数は多かったと思います(笑)
それでも2系の情報は拾ってしまうのでGoogleの検索条件に期間指定したりしてました。
(これだけ変更するならバージョンの別名とかつけてくれるとうれしかったかも…)

v3系の情報はこれからもっと出てくると思いますので、この辺の苦労はその内なくなると思います。

それよりもC++11の機能が使えるメリットの方が断然大きいと僕は思います。
autoでタイプ数をかなり減らせますし、std::unordered_mapやstd::function、ラムダ式が使えるのも嬉しいです。
for(auto i : map)みたいな走査ができるのも便利でした。
Cocos2d-x自体の変更で言えばCC地獄からの解放、cocos2d::Valueの登場、EventListener方式によるタッチやカスタムイベントの取得、なんかが便利でした。

タッチイベントの取得と処理順まわりは、少し苦戦したところもあったので
しっかり理解した方がいいかもしれません。
追記:別で記事を書きました->Cocos2d-x v3 タッチイベントについて

なので依存度が高いツールがv2系しか動かないなどの明確な理由が無い限り
これから作成するアプリはv3にした方が効率は上がるのではないのかな、と思います。

既存アプリの移植に関しては、結構大変かもしれません。
(“CC”の他にもCCDictionary->ValueMapなどの対応が厄介そうな気がします)

C++大丈夫だった?

全然大丈夫じゃなかったです…。
Cocos2d-xが吸収してくれてたとしても、やはりC++。
メモリ周りの理解はしっかりした上で始めないとかなり開発効率は落ちます。
それから、宣言と実装が分かれているという点も不慣れで辛かったです。
まずメモリとポインタ、それからC++の基本的な言語仕様は把握した方が良いと思います。

あとは文字列操作などのメソッドは組み込みライブラリでは必要最低限といった感じなので
自分で用意する必要があります。

ある程度のところまで勉強できれば個人開発の規模ならば困ることは無いような気がします。
下記に勉強用に買ってよかった書籍を載せておきます。

ポインタ


やはりC/C++なのでポインタ周りの理解は絶対しておいた方がいいです。そんなに固くなく、かなり読みやすかったです。かつ入門書では分からない深いとこまで突っ込んでいる本です。

C++


C++の文法をきっちし項目毎に説明してくれてます。読む前にはCのことをある程度理解していた方が良いと思います。
入門とは書いてありますが、入門書でC++をざっくり掴んでから詳細に理解する時に読む、辞書的な使い方がオススメです。

おまけ:WebにあったC言語のPDFが分かりやすかったのでご紹介
でんさんラボさんが公開しているC言語プログラミング入門がかなり分かりやすかったです。ボリュームが丁度よかったです。

ハマりどころは?

やっぱりネイティブ連携が一番ハマりました…。
ちょっと作業時間の見積もりを多く取って置いたほうが良いかもしれません。

それからCocos2d-xが原因ではないのですが使用した一部フレームワークが64bitのアーキテクチャに対応しておらず
iOSの実機デバッグはできるけどAdHocビルドができない…なんて問題も結構苦労しました。

おすすめ書籍

追記:この記事を書いた当初はv3対応の書籍はなかったのですがv3版の入門書籍が発売されました!
Cocos2d-xをiOS/Androidで動かすから始まりC++11の文法、ツールやライブラリと多岐に渡って紹介されています。

使ったツール/サービスって?

メジャーどころを使ったので、調べればすぐに出てくるかと思いますが…

テクスチャアトラス生成

TexturePacker(有償)

 

複数画像を1枚のテクスチャアトラスにしてくれるツールです。

有償ツールですが、買う価値は全然あると思います。
画像に変更があると自動で更新もしてくれるので、非常に便利。

物理エンジン&ステージエディット

R.U.B.E(有償)

iforce2dという物理エンジン関係の情報を提供しているサイトの方が作ったツールです。
カビDONではステージエディターとして使いました。
少し操作に癖のあるツールですがカスタムプロパティ設定などの汎用性が高くとても重宝しました。
ツール内でシミュレートの機能もあったりします。
かなりオススメです。

パーティクル

ParticleDesigner(有償)

いわずとしれた、パーティクル演出を作成するツール。

アニメーション

CocoStudio AnimationEditor(無償)

FlashIDEライクな操作が出来て使いやすかったです。
また簡単にフレームイベントを発行して、それをプログラム側で拾うこともできます。
余談ですがMac版のCocoStudioのUIEditorも使いましたが、ほぼ別物なので素直にWindows版を使ったほうが良い気もします。

ビットマップフォント

Glyph Designer(有償)

ビットマップフォントを作成するツールです。これもかなりメジャーなツールです。

プッシュ通知

ニフティクラウド mobile backend(有償/フリープランあり)

アプリの更新を通知するためだけに使ってます(笑)
GUIに依存する部分が少ない処理のためハマりどころも少なく
サンプルコードも充実してたのでサクっと実装できました。
現在のところFreeプランで全然収まってます。

広告切り替え

AdMobメディエーション(無償)

設定したCPMに応じて広告配信サービスを切り替えてくれるサービスです。
(でもできれば、パーセンテージで設定したいのですが…)

AdMobがサポートしていれば、SDKの組み込みだけで呼び出すことが可能で
そうじゃない場合もカスタムクラスを用意しさえすれば、呼び出すことが可能です。
また国別に配信するかどうかを決めることもできます。
当たり前ですがAdMobの広告の組み込みが必須となります。

iOSベータアプリ配信

TestFlight

これも説明する必要がないほど有名なツールです。
iOSではデフォルト設定では実機デバッグ時に接続された端末に最適化したバイナリを吐き出すので
実機で動いたからといって配信用でもビルドが通る訳ではありません。

なので最後に配信用ビルドすると時間が無い中ややこしい問題が発生して、どの変更でそうなったかが把握しづらくなり泣けると思います。

配信のため定期的にAdHoc用ビルドすると、こういう問題の早期発見につながると思います。

これからこのブログでは…

カビDONで得たCocos2d-xまわりの話を記事にしていこうと思います。
今回の概要記事で触れたトピックの中で知りたい内容があれば、気軽にご連絡頂ければ嬉しいです。