読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

TravelShooting JP Android版開発進行中!

Android TravelShooting JP

TravelShooting JPのアンドロイド版がようやく形になってきました!

Androidで動作しているアプリを動画として取り込む方法をまだ知らないのでカメラでNexus 7の画面を撮影しています。
ゲームの操作に気をとられてカメラの向きがずれてしまっていますが、ご勘弁ください。

今のところ、背景、主人公キャラクター、主人公の弾の表示まで移植が進んでいます。

始めてのcocos2d-x & C++ & Android & Eclipseのため、環境の構築でいきなりつまずいてしまいました。

結局、「cocos2d-xで始めるスマートフォンゲーム開発」という本を購入し、それを参考にしつつ試行錯誤の末、何とかAndroid向け開発環境を構築することができました。

環境が構築できたので早速coco2d & Objective-Cの環境で開発したTravelShooting JPをcocos2d-x & C++の環境に移植する作業に入りたいところです。
しかし、その前にcocos2d-xとC++の知識をある程度得ておく必要があります。
そこで、前述の書籍にでてくる最初のサンプルゲーム「かわずたんキャッチ」を作るところから始めました。ただ打ち込むだけでなく、C++についての勉強も並行して行っていたので、完成までに結構時間が掛かりました。
かわずたんキャッチが完成する頃にはcocos2d + Objective-Cのコードを頭の中でcocos2d + C++のコードに変換するコンバーター機能がある程度身に付きます。

私はこの段階からTravelShooting JPの移植作業をスタートしました。
単なる移植なのですが、Obejective-Cと比較するとC++はより厳密な記述を要求する言語のようで、結構な数のバグが出てきます。
一番多いのはメンバ変数(インスタンス変数)の未初期化による誤動作です。
Objective-Cは親切にインスタンス変数をゼロに初期化してくれるので、明示的な初期化を忘れても結構動いてしまったりするのですが、C++にはそんな親切心は一切なく、初期化を忘れたメンバ変数の値は「不定」となりますので、上手く動いたりおかしな動きをしたりクラッシュしたりと非常にわかりにくいバグとなって表面化します。
逆に考えると、良くわからない現象が現れたときはメンバ変数の初期化忘れを最初に疑うと良いかもしれません。

そして、iOSAndroidの違いでこれから問題になりそうなのが、テクスチャのフォーマットです。
iOSではPVRTCで圧縮する事で、圧縮なしのRGBA8888と比較してかなりメモリ使用量やアプリのサイズを縮める事が可能です。
↓参考↓


PVRTC4形式でテクスチャーを圧縮してメモリ使用量とアプリサイズを大幅削減 - 夏までにiPhone アプリつくってみっか!

Androidの場合、デバイスによりGPUが異なるため、GPUに合わせて数種類の圧縮方式があり、それぞれ用の圧縮テクスチャファイルを用意するか、アプリサイズ+メモリ使用量を妥協して非圧縮のテクスチャをpngで圧縮したファイルを用意する必要があるようです。

今さらかも知れませんが、iOSオンリーのアプリ開発が素晴らしく恵まれた環境だったことに気がつきました。
開発途中で挫折せずにアプリを2本リリースできたのはこの恵まれた環境のおかげだったと思います。
逆に、cocos2d-xでiOS + Android両対応を目指していきなりアプリ開発を始めていたら早々と脱落していた可能性が高いです。

急がば回れ、ですね。