2014年3月2日日曜日

[cocos2d-x v3.0beta2] v2.1.5からの移行メモ

 v2.1.5からv3.0beta2へ、まず動くこと、を目標にした作業メモ

 多分、cocos2d iphoneから移行してきた人向き

1)deprecated warningを削除

 全ソースからクラスプレフィックスCCを削除

 シングルトン取得メソッドの変更shared*()getInstance()

 など

2)コーディングスタイルをあわせる

 特にフィールドのプレフィックスが"m_"から"_" に変わっているため、派生クラスで利用していた場合、対処は必須

3)cocos2d::CCObject::init*(...) → cocos2d::Object::crete*(...)

 cocos2d::CCObject()派生クラスでinit()系メソッドがpublicからprotectedに変更されたため、継承クラスやインスタンスを自前でnewしていた箇所の修正が必要

 new → init()create() → retain()に比べautorelease()retain()
の呼び出しが抑えられていたのだが…、はい、誤差です

4)copyWithZone(cocos2d::CCZone pZone*) → clone()

 cocos2d::CCObjectの基底クラスであるcocos2d::CCCopyingおよびその引数として用意されていたcocos2d::CCZoneが廃止されたことからcopyWithZone()メソッドが消滅

 コピーが必要な場合、cocos2d::Clonableを継承しclone()メソッドを実装

5)cocos2d::CCSring → std::string

 cocos2d::CCStringに対応するcocos2d::Stringがないこと、事実上の吸収先とも言えるcocos2d::Valuecocos2d::Object派生でないことからstd::stringへ移行

 C++11よりCOWが廃止されたことからcocos2d::CCStringをポインタ渡ししていた箇所は確実にstd::string参照渡しとしてパフォーマンスの無用な低下を防ぐ

6)cocos2d::CCArray → cocos2d::Vector

 cocos2d::CCArraycocos2d::CCObject派生、cocos2d::Vectorは基底クラス、ということで参照カウンタがない

 ライフサイクル管理が必要な場合、std::shared_ptrを導入

 cocos2d::Vectorを簡単に言うと内部で参照カウンタ操作が実装されたstd::vectorラッパー

 主な操作はcoco2d::CCArraycocos2d::Vectorとして以下のように対応する

 objectAtIndexat
 countsize
 addObjectpushBack
 removeObjecteraseObject
 removeObjectAtIndexerase

 CCARRAY_FOREACH(array, obj)for (auto &it : vector)

7)cocos2d::CCDirectory → cocos2d::Map

 CCArrayと同じくcocos2d::CCObject派生から基底クラスになっているため参照カウンタがない

 ライフサイクル管理が必要な場合、std::shared_ptrを導入

 cocos2d::CCArrayに対してこちらは参照カウンタ操作が実装されたstd::unordered_map(もしくはstd::map)ラッパー

 主な操作はcoco2d::CCDictionarycocos2d::Mapとして以下のように対応する

 objectForKeyat
 countsize
 setObject(value, key)insert(key, value)
 removeObjectForKeyerase

 CCDICT_FOREACH(dict, obj) obj->hoge();for (auto it = map.begin(): it != map.end(); ++it) (*it).second->hoge();

8)cocos2d::CCInteger、CCFloat、CCDouble etc.

 cocos2d::CCString同様cocos2d::Valueに吸収

 これらをCCArrayで管理していた場合、std::vectorに切り替え、ポインタではなくインスタンスを格納する

 この際、参照渡しや右辺参照を使い、インスタンスの生成を押さえるとベター

9)その他

 C++11およびv3.0固有の機能に対応

 autoの利用、overrideキーワードの追加、cocos2d::Layerのイベントリスナー対応、など