*

cocos2d-x v2.2からv3.3への移行

公開日: : cocos2d-x, iOS, イーモン

Products ico5

最近、イーモンの更新でiTunesにバイナリをアップロードしたら、

2015年2月から64bit対応が必須になるという警告が表示されました( ̄◇ ̄;)

アップル、iOSアプリにiOS 8と64bit対応を義務化。2015年2月以降の新規アプリから

イーモンではKii Couldをcocos2d-x v2.2を使っているので

これらライブラリを最新版にアップデートする必要がありそうです。

cocosはコンテナやタッチ処理、文字列の扱いなどが大きく変わっていて

イーモンの移行はテストも含めて結構大変そうです\(^o^)/

幸いにも、移行方法はすでわかりやすくまとめられているかたがいて

大変参考になりました。

cocos2d-x version2.2.3からversion3.2rc0への移行メモ

cocos2d-x v3はC++11の新機能を使うようになっているので

気になったところをメモしておきます。

さらばCCArray、CCDictionary

v2ではコンテナとしてCCObjectを要素にもつCCArrayやCCDictionaryが使われていました。

v3からはstdコンテナにならったVectorとMapが推奨されています。

NodeのchildrenやアクションのSequenceの引数などがVectorに変わっているので

変更が必要です。型チェックがより厳密なのでデバッグがしやすいです。

Vector<FiniteTimeAction *> actions(3);
actions.pushBack(RotateBy::create(1.0f, 360));
actions.pushBack(MoveBy::create(1.0f, Vec2(30, 30));
actions.pushBack(ScaleBy::create(1.0f, 1.5f));
for (auto action : actions) {
	CCLOG("action: %s", action->description().c_str());
}

さらばCCString

変更が必要なのは文字列CCStringです。

CCStringは非推奨となり、std::stringが使われています。

std::stringはcocos2d::Ref(従来のCCObjectに相当)を継承しないため

VectorやMapは使えませんが、単純にstd::vectorやstd::mapが使えます。

typedef std::vector Strings;

coco2d::Valueですっきり、std::moveでグルグル

また数値や文字列を混在させたい場合には、cocos2d::Valueが用意されています。

ValueはRefを継承しないので、stdコンテナを使います。

今後は文字列をstdコンテナで統一して扱うようです。

こっちのほうが依存度もさがり、すっきりしていいですね。

typedef std::vector Values;
Values.push_back(Value(true));
Values.push_back(Value(1));
Values.push_back(Value(10.0));
Values.push_back(Value("cocos2d!"));
for (auto v : Values) {
	CCLOG("value type:%d", v.getType());
}

文字列をstd::stringで管理しやすくなったのは、C++11のrvalueのおかげ!

所有権のムーブが言語でサポートされ、無駄な文字列コピーを抑制できます。

流暢にrvalueを使いこなすには慣れが必要そうですが、

こちらに、迷いそうな点が実用的にまとめられています。

C++11 std::move 個人的まとめ

参考にさせていただきました。

タッチ処理

リスナーはEventListenerというクラスに抽象化され、ハンドラを登録するようになりました。

    auto touchListener = EventListenerTouchOneByOne::create();
    touchListener->setSwallowTouches(true);
    touchListener->onTouchBegan = CC_CALLBACK_2(S2TapDispatcher::onTouchBegan, this);
    touchListener->onTouchMoved = CC_CALLBACK_2(S2TapDispatcher::onTouchMoved, this);
    touchListener->onTouchEnded = CC_CALLBACK_2(S2TapDispatcher::onTouchEnded, this);
    touchListener->onTouchCancelled = CC_CALLBACK_2(S2TapDispatcher::onTouchCancelled, this);

    auto dispatcher = Director::sharedDirector()->getEventDispatcher();
    dispatcher->addEventListenerWithFixedPriority(touchListener, priority);

Json(Spine)

Jsonのネームスペースがcocos2d::extensionJsonからグローバルになりました。

parse_numberの処理がかわり、24bitを超える桁数の整数を扱うとおかしくなります。

不具合でる場合、前のものに戻したほうがよいかも。

static const char* parse_number (Json *item, const char* num) 
...
n = (float)strtod( num, &endptr );
...

その他

Vec2とSize

ccpマクロは廃止され、Vec2クラスを使うようになりました。

auto position = Vec2(x, y);
auto size = Size(width, height);

スレッド

ミューテックスやロックにstdを使うようになりました。
しかし、ダブルロックしそうなところはまだ残っていました。

std::condition_variable_any _condition;
std::mutex _mutex;
{
	std::unique_lock lk(_mutex);//このスコープをロック
	auto t = std::thread(CC_CALLBACK_0(myThread, NULL));
	t.detach();
	auto status = _condition.wait_for(lk, std::chrono::seconds(3));//3秒待機
	if (status == std::cv_status::timeout) {
		CCLOG("timeout!");
	}
}

フォント

LabelやLabelAtlasクラスが追加されました。

BMFontのプロパティはFontAtlasというクラスに集約されています。

64ビット(arm64)

ポインタが64bitになったので、getUserDataなどvoid *型を使っているところで
エラーでるかもしれません。

bit長(32bit) bit数(64bit)
char 8bit 8bit
bool 8bit 8bit
int 32bit 32bit
long 32bit 64bit
long long 64bit 64bit
ポインタ 32bit 64bit
size_t 32bit 64bit
NSInteger 32bit 64bit
enum
サイズに依存するコードを記述しないこと
32bit 64bit

参考
Cocoa Touch 64ビット移行ガイド

Sponsored Link

関連記事

Screenshot-2013.11.14-03.18.26.png

Cocos2d-xでGaussianBlur(ぼかしフィルター)

cocos2d-xにGaussianBlurが見つけられず、ググっていたらサンプルをみつけまし

記事を読む

AppIcon60x60@2x.png

ホーム画面にショートカットアイコン(スキームアイコン)を作成する

iOSのSafariには共有メニューにがあり、表示させているページへのショートカットアイコン

記事を読む

no image

Renderer::visitRenderQueueで落ちる場合

Cocos2d-x v3にしてから描画で突然落ちる場合があり、 原因をたどっていくと、Re

記事を読む

teach_s.png

[eMon] English Monstersレビュー申請中

先日、新しいiOSアプリを審査に出しました。 English Monsters(略してeM

記事を読む

monster_kolion.png

【イーモン】11月8日デザフェス出展!

デザインフェスタに出展します! デザフェス出展者ページ 英語学習アプリ【イーモン】のキャラ

記事を読む

internet_share.png

インターネット共有のステータスバーを表示させない

私の作っているアプリではcocos2d-xでCCEAGLViewを表示させるUIViewCo

記事を読む

cocos2d-xのSupporting IPv6-only Networks対応

2016年6月1日より、AppStoreに更新されるすべてのアプリは、IPv6-only netwo

記事を読む

blog.png

cocos2d-x v2.2からv3.3rc0 その2

イーモンを鋭意更新中です。 アイキャッチは魔法使いの高ランク装備グラです。 coc

記事を読む

emon_banner_small.png

eMon

eMonのプレイ動画をアップロードしました。 なぞって、つなげて回答するシステムが

記事を読む

clipping.png

GL_SCISSOR_TESTを使ったクリッピング

cocos2dでNodeの描画をクリッピングするにはCCClippingNodeやCGCon

記事を読む

Sponsored Link

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Sponsored Link

  • 発音辞書イーモン
  • English Monsters
  • sLog(時間管理アプリ)
  • 生粋のC++プログラマーです。 最近は、Objective-Cやxcode、cocos2d-xなどを学びながらiPhoneアプリを開発しています。

Google+ Google
PAGE TOP ↑