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

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

【cocos2d】cocos2d v2.0プロジェクトをv2.1にアップグレードする方法

これまでcocos2d v2.0を使い続けて来ましたが、v2.1がリリースされてからしばらく経ちます。
現状v2.0で特に困ることはありませんし、問題なく動いているプロジェクトに余計な手を入れるのは気が進みませんが、完成間近に何らかの理由でアップデートせざるを得なくなってそのときに問題が出ると何かと厄介です。
どうせなら早いうちに片付けておこうということで重い腰を上げました。
(そして、実際に問題が出ました!)

早速参考になりそうな情報をググってきました。
http://pentacreation.com/blog/2013/10/131002.html
情報、ありがとうございます。

cocos2d v2.1のインストールはこのサイトに書いてある通りでOKです。
これで今後新規作成するプロジェクトはv2.1となります。

既にv2.0で作ってあるプロジェクトは手動でv2.1に上げる必要があります。

1. データコピー用にダミープロジェクトを作成

既存のプロジェクトをv2.1にアップデートするにあたって、まずはv2.1のテンプレートから適当なプロジェクトを作成します。このプロジェクトから既存のプロジェクトに必要なデータをコピーします。

f:id:takujidev:20131214155006j:plain

テンプレートの説明にv2.0と書いてあるので不安になりますが、cocos2d.mを開いてみるとv2.1と書いてあるので問題ないでしょう。

f:id:takujidev:20131214155231j:plain

2. 既存のプロジェクトのlibsフォルダーをXcodeから削除する

Xcode上のlibフォルダーの右クリックメニューから、Deleteを選択します。

f:id:takujidev:20131214160126j:plain

Remove References か Move to Trashか聞いて来るのでMove to Trashを選択します。

f:id:takujidev:20131214160232j:plain

3. ダミープロジェクトからlibsフォルダーをコピーする

Xcodeの右クリックメニューから、Add Files to "プロジェクト名"...を選択します。

f:id:takujidev:20131214160616j:plain

ファイル選択ウィンドウが開くので1.で作成したダミープロジェクト内のlibsフォルダーを指定します。
このとき、Copy items into destination group's folder (if needed)にチェックをつけ、Create groups for any added foldersを選びます。
その後、Addボタンをクリックします。

f:id:takujidev:20131214160952j:plain

libsフォルダーは右クリックメニューを開いた位置に作られます。必要であればドラッグして移動できます。

4. cocos2dのファイルにARC非対応フラグをつける

ARCを使っていないプロジェクトならここは不要です。

  • fno-objc-arcフラグをcocos2dのファイルにつける事でARC対応しているプロジェクトの場合は改めて新しいcocos2dファイルにフラグをつける必要があります。

cocos2dプロジェクトのARC対応の方法について詳しくは、
【cocos2d】Xcode5で新規cocos2dプロジェクトを一番簡単にARC対応にする方法 - 夏までにiPhone アプリつくってみっか!
をご参照ください。

5. CoreText.frameworkを追加する

この段階でプロジェクトを実行しようとするとApple Mach-O Linker Errorと表示されます。エラーの詳細は下記の通りです。

Undefined symbols for architecture armv7:
  "_CTFontManagerRegisterFontsForURL", referenced from:
      -[CCLabelTTF getFontName:] in CCLabelTTF.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

参考にさせていただいたページによりますと、CoreText.frameworkを追加する必要がありそうです。
プロジェクトのGeneral設定のLinked Frameworks and Librariesのところの"+"ボタンを押してCoreText.frameworkを選択し、Addボタンをクリックします。
f:id:takujidev:20131214162532j:plain

6. コードを修正する

必要であればコードの修正を行います。
私のプロジェクトの場合は一カ所インスタンス変数名の修正が必要でした。
v2.1からはAppleが推奨するとおり、変数名の前にアンダーバーをつける形式に変更になってるのが原因です。
下記の場合、quad_を_quadに修正する事でエラーが出なくなります。

f:id:takujidev:20131214163019j:plain

そして、v2.1に上げたことでアプリの動作に1つ問題が発見されました。
しばらく気がつかなかったのですが、プレイヤーがやられたときにCCActionで空中から地面に落ちて行くアニメーション処理をしているところで何故か猛スピードで地面を突き抜けて奈落の底に落ちてしまうようになってしまっています。

恐らくv2.1に上げたのが原因だろうという事で調べてみると、有用な情報が得られました。
http://www.cocos2d-iphone.org/forums/topic/possible-bug-ccmoveto-behavior-inconsistent-between-2-0-and-2-1/
どうやら、v2.0とv2.1では移動系のCCActionの動作が変わっているようです。
v2.1に合わせてコードを変えるのも面倒なので、上のサイトを参考にv2.0と同じ動作になるように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

に変更すればOKです。
動作を確認すると、ちゃんと地上で止まってくれて一安心。

これ以上新たな問題が出てこない事を祈ります。
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