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

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

【cocos2d】cocos2dプロジェクトをARC対応にする

追記:Xcode5だとここに書いてある方法ではは上手く行かないみたいなので、もっと簡単なこちらのリンクに書いてある方法をオススメします。
【cocos2d】Xcode5で新規cocos2dプロジェクトを一番簡単にARC対応にする方法 - 夏までにiPhone アプリつくってみっか!


久々に新しいXcodeプロジェクトファイルを作成しました。
今回はcocos2d/Box2Dのテンプレートを使い、スタティックライブラリによるARC対応を行いました。この方法はLearn cocos2d 2: Game Development for iOSに書かれている方法で、ほんの著者のサイトのこのページでも詳しく紹介されています。


1. テンプレートからプロジェクトを作成する
今回は物理演算エンジンを使ってみたかったのでcocos2 iOS with Box2dを使用しました。もちろん他のテンプレートでも大丈夫です。
f:id:takujidev:20130629210328j:plain

2. libsフォルダーを削除する
libsフォルダーの上で右クリックメニューからDeleteを実行します。ポップアップウィンドウではRemove Referencesを選び参照だけを削除します。
f:id:takujidev:20130629211500j:plain

3.Targetを追加する
Xcode左のナビゲーターペインの一番上の行(下記の例では青いアイコンがあるPhysicsGameの部分)を選択すると出てくるプロジェクト設定画面左下の+Add Targetボタンを押します。
出てくるウィンドウ左側、iOS/Framework&Libraryを選ぶと出てくるCocoa Touch Static Libraryを選択し、Nextを押します。
f:id:takujidev:20130629212731j:plain

4. Static Libraryに名前を付ける
cocos2d-libraryと名前を付けFinishボタンを押します。名前は何でもかまいません。
f:id:takujidev:20130629212708j:plain

5. 追加したターゲットのビルドセッティングを変更
プロジェクト設定画面左のTargetsにcocos2d-libraryという項目が追加されているのでそれを選択します。Build SettingsタブのSearch Pathsの一番上のAlways Search User PathsがNoになっているのでYesに変更し、User Header Search Pathsの項目に./**と入力します。入力完了後./**/**となっていたら修正する。
f:id:takujidev:20130629213713j:plain

6. 元からあったターゲットにライブラリーをリンクする
cocos2d-libraryでない方のターゲット(この例の場合はPhysicsGame)を選択し、Build PhasesのLink Binary With Librariesの項目を開き小さな+ボタンを押します。
f:id:takujidev:20130629214407j:plain
ライブラリーの選択画面が出ます。一番上のlibcocos2d-library.aを選択し、Addを押します。f:id:takujidev:20130629214557j:plain
Link Binary WithLibrariesの中に追加されます。赤色で表示される場合もありますが、特に問題はないようです。

7.cocos2dのファイルをcocos2d-libraryターゲットに追加する
XcodeのFileメニューからAdd Files to "プロジェクト名"を実行します。
f:id:takujidev:20130629215022j:plain
ファイル選択画面になりますので、プロジェクトフォルダ内のlibsフォルダーを選びます。
Copy items into destination group's folder (if needed)のチェックを外し、Create groups for any added foldersを選択。Add to targetsではcocos2d-libraryだけにチェックを入れ、Addボタンを押します。
f:id:takujidev:20130629215327j:plain
これでスタティックライブラリーの設定は完了です。

8. プロジェクトをARC対応にリファクターする
Edit > Refactor > Convert to Objective-C ARC...を実行します。
f:id:takujidev:20130629220107j:plain
コンバートするターゲットはスタティックライブラリーでない方を選択します。
f:id:takujidev:20130629220234j:plain
説明画面でNextを押します。
f:id:takujidev:20130629220324j:plain
数秒待たされます。
f:id:takujidev:20130629220421j:plain
変更点が表示されます。多分問題ないはずなのでSaveを押します。
f:id:takujidev:20130629220546j:plain
自動的にスナップショットを取るようにするかどうか聞いてきますので、お好きな方を選んでください。Enableにしておけば安心です。
f:id:takujidev:20130629220722j:plain


9. トラブルシューティング

その1
iOS 5.0シミュレーターでテンプレートのサンプルプロジェクトを実行してみるとエラーが発生しました。6.0や6.1だと問題ありません。

cocos2d: Using Director Type:CCDirectorDisplayLink
dyld: lazy symbol binding failed: Symbol not found: _objc_setProperty_nonatomic
  Referenced from: /Users/Myname/Library/Application Support/iPhone Simulator/5.0/Applications/86A06456-63A8-4C08-A5EA-7862381344D4/PhysicsGame.app/PhysicsGame
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/Foundation.framework/Foundation

dyld: Symbol not found: _objc_setProperty_nonatomic
  Referenced from: /Users/Myname/Library/Application Support/iPhone Simulator/5.0/Applications/86A06456-63A8-4C08-A5EA-7862381344D4/PhysicsGame.app/PhysicsGame
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/Foundation.framework/Foundation

この場合は、iOS Deplyment Targetを確認してください。
プロジェクトのiOS Deployment Targetが5.0になっていても安心できません。
f:id:takujidev:20130629220854j:plain
cocos2d-libraryターゲットの方のBuild Settingsの方も5,0にしてあげる必要があります。
f:id:takujidev:20130629221018j:plain

その2
実機で実行するとこのエラーが出ることがありました。

cocos2d-library was rejected as an implicit dependency for 'libcocos2d-library.a' because its architectures 'armv7' didn't contain all required architectures 'armv7 armv7s'

この場合は、cocos2d-libraryターゲットのBuild Active Architecture OnlyのDebugの方がデフォールトでYesになっているのでNoにすると解決できました。Yesのままで問題ない場合もあるので少し謎です。
f:id:takujidev:20130629221336j:plain

その3
Retina機種でテンプレートプロジェクトを実行を実行すると上から落ちてくるブロックの表示が変になりますがこれは気にしなくても良いようです。
f:id:takujidev:20130629221946j:plain
AppDelegete.mmのRetina設定の部分をNOにすると本来の姿が拝めます。

	// Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
	if( ! [director_ enableRetinaDisplay:NO] )
		CCLOG(@"Retina Display Not supported");

f:id:takujidev:20130629222123j:plain




BeeClusterをレビューにSubmitしてからまる1週間が経過しましたが、絶賛Waiting For Review状態となっております。結構長く待たされるものなんですね。