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

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

cocos2d 2.1を2.2にバージョンアップして恐怖の64bit対応

cocos2d 2.1で開発したTravelShooting JP iOS版ですが、Appleによる64bitアーキテクチャ対応への期限が迫ってきたので恐る恐るcocos2dをバージョン2.2にアップグレードし、64bit対応を実施しました。

64bitアーキテクチャに対応していない場合、6月1日以降はアプリのバージョンアップ版のAppStoreへのサブミットを受け付けてくれなくなります。

5月中に駆け込みサブミットし、現在Appleによる審査待ちのTravelShooting JPですが、あるユーザーさんから「サウンドテストモードがあったら嬉しい」との貴重なご意見を頂いたので、ぜひ次の次のバージョンで実装したいのですが、そうなると、64bit対応が必須になります。
動いているソフトウェアにわざわざ手を入れるのはプログラマーの心理としてはできればやりたくないことですがそうも言ってられないので、まずはググって先人からの情報を仕入れ、十分に下調べします。

そこでたどり着いたページがここ。
ralabaloza.blogspot.co.uk
この方はバージョン2.0から2.2へのアップグレードなので少し違いますが、恐らく問題ないでしょう。

早速ステップ0から実行します。

0. バックアップを取る。
問題無し。TimeMachineでバッチリ取れています。

1.と2. BuildSettingsのArchitectureの設定をStandard architectures (armv7, arm64) - $ (ARCHS_STANDARD)に変更する。
OK。
Valid Architecturesにarmv7sを含めるかどうか悩ましいですが、cocos2d-xのフォーラムでは含めるべきでないという結論になっていて、実際にcocos2d-x 3.4のプロジェクトを確認して見るとarmv7とarm64だけになっているので、それに習いarmv7sは外しました。
http://discuss.cocos2d-x.org/t/should-we-remove-armv7s-in-valid-archs/17246discuss.cocos2d-x.org

3. CCDirectoriOS.hでエラーが出る。
出た。

4.と5. libsフォルダー内のcocos2d, CocosDenshion, Kazmathフォルダーをcocos2d v2.2の物に差し換える。
libsフォルダーから削除し、下記サイトからバージョン2.2.0をダウンロードし、その中の前述のフォルダーをプロジェクトのlibsフォルダーにコピー。
http://cocos2d.spritebuilder.com/downloadcocos2d.spritebuilder.com

6.と7. Build PhasesのLink Binary With LibrariesにCoreText.frameworkを追加する。
これは不要でした。以前2.0から2.1にアップグレードしたときに追加していましたので。

この先のARM_NEONの問題は私の環境では出ませんでした。

しかし、ARC関連の問題が発生しました。
このプロジェクトはARC対応ですがcocos2dはARC非対応なのでcocos2d関係のファイルに-fno-objc-arcコンパイラーフラグを付ける必要があります。
2.2へのバージョンアップでcocos2dのファイルが全て入れ替わるので、再度指定する必要があるのです。
具体的には、下記のページの手順2.と 3.だけを行います。
tf.hateblo.jp

あとはコンパイルして出てくるWarningを消して行きます。

ほとんどはフォーマット指定子の%dを%ldに変えてNSIntegerの変数を(long)でキャストするだけです。
Xcodeがサジェスチョンしてくれるのでそれをそのまま受け入れるだけです。
例えばこんな感じです。

    _highScoreLabel.string = [NSString stringWithFormat:@"%ld", (long)_highScore];

NSIntergetは64ビット環境では8バイト、32ビット環境では4バイトなので、どちらの環境でも同じになるように8バイトのロングとして扱うということだと思います。
すみません。うそ書いてしまいました。32bit CPUではNSInteger = long = 4バイト、64bit CPUではNSInteger = long = 8バイトなので、どちらの環境でもNSInteger = longだから、という事かな?

あと、TravelShooting JPではCCMoveToの動きがおかしくなるところが一箇所あったので、V2.0コンパチのモードに修正します。
(V2.1にアップデートしたときも同じ修正をしましたがcocos2dを入れ替えたのでやり直す必要があります。)

ccConfig.hの

#ifndef CC_ENABLE_STACKABLE_ACTIONS
#define CC_ENABLE_STACKABLE_ACTIONS 1
#endif

の部分を

#ifndef CC_ENABLE_STACKABLE_ACTIONS
#define CC_ENABLE_STACKABLE_ACTIONS 0
#endif

に修正します。

私は64bit CPUが載ったiOSバイスを持っていないので残念ながら実機では確認できず、iOSシミュレーターのiPhone6での確認になりますが、無事に動いているようです。
32bit CPUのiPhone5での動作も実機で確認しましたが、変更による影響はなく、いつも通り軽快に動作しています。

逆にあまりにスムーズに事が運んだので本当に64bitモードで動いているのかどうか不安になります。

本当に64bitモードで動いているかどうか検証して安心したいところですが、長くなったのでまた次回!

続編はこちら↓
tf.hateblo.jp


https://itunes.apple.com/jp/app/travelshooting-jp-toraberushutingu/id917570972?mt=8&uo=4&at=10laCt
https://itunes.apple.com/jp/app/beecluster-wu-liaono-zongsukurorushutingugemu/id663801586?mt=8&uo=4&at=10laCt