iOS
cocos2d-x

【cocos2d-x】v2.0.4からv2.2.6に一気に上げた際にやったことをメモ【iOS 64bit対応】

More than 3 years have passed since last update.


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に入れてビルドしたら以下のようなエラーが出ました。

1.png

cocos2d-x v2系はアナウンスが出た当時、64bitに対応していませんでした。

その時に以下のトピックで対応の議論がされていました。

cocos2d-x v2系 64bitについて

そして64bit対応版v2.2.6がリリースされましたので、

そちらに更新した際に行った事をメモっておきます。


void init()

2.png

こんなエラーが結構ありました。


Test.cpp

bool init();


が正しいので、voidからboolに修正。


CCFileUtils::getWritablePath()

3.png

typoですかね。


  • v2.0.4 : writeable

  • v2.2.6 : writable

となっています。writableに修正。


CCMenu::initWithItems()

4.png

v2.0.4ではinitWithItems()という関数があったのですが、

その後、無くなったようです。

対応方法はいくつかあると思います。


  • CCMenuを拡張し、initWithItems()を作っちゃう

  • initWithItemsは結局CCArray化→initWithArray()してるだけなので、そうする

  • 別のやり方にする(使わないとか)

今回はサクッとinitWithArrayを使うように修正。


Error : Cast from pointer to smaller type ~

5.png

こんなの。

これは何かと言いますと、CCNodeのgetUserData()の戻り値をintにキャストしてると発生します。


CCNode.cpp

//~

void * CCNode::getUserData()
{
return m_pUserData;
}

void CCNode::setUserData(void *var)
{
m_pUserData = var;
}
//~



Test.cpp

void Test::receive(CCMenuItem* sender)

{
int value = (int)sender->getUserData(); // ←コレ
}

こんな感じで使ってたりすると出ます。

cocosって言うより、C → C++ の問題かな?

以下のように対応。


Test.cpp

/*

void Test::receiveMenuItem(CCMenuItem* sender)
{
int value = *(int*)sender->getUserData();
}
*/


追記:上記実装だと実行時に落ちてしまいました。

素直に


Test.cpp

void Test::receiveMenuItem(CCMenuItem* sender)

{
CCInteger* value = (CCInteger*)sender->getUserData();
}

ラッパークラスを使うのが正しいですね。


Error : expacted unqualified-id

これは以前にも書きましたので、そっちのリンクを貼っておきます。

Qiita記事

C++とObj-Cが混在しているクラスがあると発生します。

Identify and Type → Type を Objective C++にして対応。


以上

とりあえずこんなもんでビルドが通るようになりました。

細かい動作までは把握しきれていませんので、

もしやる方がいたら動作確認はしっかりと行いましょう。