iOS 64bit対応
既存のcocos2d-xプロジェクトの64bit対応というメ(ry案件が緊急で飛び込んで来まして、
2015年2月1日より実施と思っていたのですが、
具体的には
- 新規 = 2015年2月1日より64bit対応してないと申請通しませんよ
- 更新 = 2015年6月1日より64bit対応してないと申請通しませんよ
という事だったのですが、反射的に対応してしまったため、
その時にやったことをメモしておきます。
cocos2d-x v2系について
cocos2d-x v2.0.4のプロジェクトをそのまま、
arm64をarchitecturesに入れてビルドしたら以下のようなエラーが出ました。
cocos2d-x v2系はアナウンスが出た当時、64bitに対応していませんでした。
その時に以下のトピックで対応の議論がされていました。
cocos2d-x v2系 64bitについて
そして64bit対応版v2.2.6がリリースされましたので、
そちらに更新した際に行った事をメモっておきます。
void init()
こんなエラーが結構ありました。
bool init();
が正しいので、voidからboolに修正。
CCFileUtils::getWritablePath()
typoですかね。
- v2.0.4 : writeable
- v2.2.6 : writable
となっています。writableに修正。
CCMenu::initWithItems()
v2.0.4では**initWithItems()**という関数があったのですが、
その後、無くなったようです。
対応方法はいくつかあると思います。
- CCMenuを拡張し、**initWithItems()**を作っちゃう
- initWithItemsは結局**CCArray化→initWithArray()**してるだけなので、そうする
- 別のやり方にする(使わないとか)
今回はサクッとinitWithArrayを使うように修正。
Error : Cast from pointer to smaller type ~
こんなの。
これは何かと言いますと、CCNodeのgetUserData()の戻り値をintにキャストしてると発生します。
//~
void * CCNode::getUserData()
{
return m_pUserData;
}
void CCNode::setUserData(void *var)
{
m_pUserData = var;
}
//~
void Test::receive(CCMenuItem* sender)
{
int value = (int)sender->getUserData(); // ←コレ
}
こんな感じで使ってたりすると出ます。
cocosって言うより、C → C++ の問題かな?
以下のように対応。
/*
void Test::receiveMenuItem(CCMenuItem* sender)
{
int value = *(int*)sender->getUserData();
}
*/
追記:上記実装だと実行時に落ちてしまいました。
素直に
void Test::receiveMenuItem(CCMenuItem* sender)
{
CCInteger* value = (CCInteger*)sender->getUserData();
}
ラッパークラスを使うのが正しいですね。
Error : expacted unqualified-id
これは以前にも書きましたので、そっちのリンクを貼っておきます。
Qiita記事
C++とObj-Cが混在しているクラスがあると発生します。
**Identify and Type → Type を Objective C++**にして対応。
以上
とりあえずこんなもんでビルドが通るようになりました。
細かい動作までは把握しきれていませんので、
もしやる方がいたら動作確認はしっかりと行いましょう。