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::Valueがcocos2d::Object派生でないことからstd::stringへ移行
C++11よりCOWが廃止されたことからcocos2d::CCStringをポインタ渡ししていた箇所は確実にstd::stringの参照渡しとしてパフォーマンスの無用な低下を防ぐ
6)cocos2d::CCArray → cocos2d::Vector
cocos2d::CCArrayはcocos2d::CCObject派生、cocos2d::Vectorは基底クラス、ということで参照カウンタがない
ライフサイクル管理が必要な場合、std::shared_ptrを導入
cocos2d::Vectorを簡単に言うと内部で参照カウンタ操作が実装されたstd::vectorラッパー
主な操作はcoco2d::CCArray → cocos2d::Vectorとして以下のように対応する
objectAtIndex → at
count → size
addObject → pushBack
removeObject → eraseObject
removeObjectAtIndex → erase
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::CCDictionary → cocos2d::Mapとして以下のように対応する
objectForKey → at
count → size
setObject(value, key) → insert(key, value)
removeObjectForKey → erase
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のイベントリスナー対応、など
2014年3月2日日曜日
2014年2月27日木曜日
[cocos2d-x v3.0beta2] XTLayerを(とりあえず)動かす
cocos2d-xでタップやスワイプを手軽に実装できるXTLayerをv3.0でも使いたい。というわけで手抜き移行を実施。
移行に際してやったことは以下の3点。
手抜きというだけあり、onTouchCancelledおよびonTouchesCancelledは未対応。
しかしながら
実際のところ、v3.0のタッチ処理はLayerで拡張するよりインターフェースから拡張する方が良さげだなぁ、と思いつつ誰かが公開してくれるのを待とう。
移行に際してやったことは以下の3点。
- v3.0準拠へ各種名称およびコンテナを変更
- deprecatedなsetTouchEnabledおよびsetTouchModeの代替を用意
- onExit時にEventDispatcherからEventListenerを削除
手抜きというだけあり、onTouchCancelledおよびonTouchesCancelledは未対応。
しかしながら
- setTouchEnabled(bool)→xtTouchEnabled(bool)
- setTouchMode(ccTouchesMode)→xtTouchMode(Touch::DispatchMode)
実際のところ、v3.0のタッチ処理はLayerで拡張するよりインターフェースから拡張する方が良さげだなぁ、と思いつつ誰かが公開してくれるのを待とう。
2014年2月24日月曜日
[tips : iPhone app] 3.2 Apps with placeholder text will be rejected
iTunes Connectよりリジェクト報告がきたので戒めのため記録。
JapaneseおよびEnglishでMetadataを作成した際、EnglishのDescriptionを簡易に済ませたところ、これが 3.2 Apps with placeholder text will be rejected にあたると判断されリジェクトを受けた。
Binaryは問題ないということなので、翻訳サイトを使いEnglishのDescriptionをJapanese相当のものに修正したところ無事Reviewを通った。
別件として、Metadataを更新する際、Default LanguageをEnglishからJapaneseに変更したところGame CenterのLeaderboard設定が無効化されたこと、うっかりしてiAdの有効化ができなかったことを併記しておく。凡ミス、良くない。
前者はバージョンアップ、後者はAdMobやnendを別途実装して対処する予定。
JapaneseおよびEnglishでMetadataを作成した際、EnglishのDescriptionを簡易に済ませたところ、これが 3.2 Apps with placeholder text will be rejected にあたると判断されリジェクトを受けた。
Binaryは問題ないということなので、翻訳サイトを使いEnglishのDescriptionをJapanese相当のものに修正したところ無事Reviewを通った。
別件として、Metadataを更新する際、Default LanguageをEnglishからJapaneseに変更したところGame CenterのLeaderboard設定が無効化されたこと、うっかりしてiAdの有効化ができなかったことを併記しておく。凡ミス、良くない。
前者はバージョンアップ、後者はAdMobやnendを別途実装して対処する予定。
[tips : cocos2d-x v3.0beta2] プロジェクト作成
cocos2d-x v3.0で最初に「おっ?」と思うのがinstall-templates-xcode.shが見つからないことだと思います。…思いましたよね?
実際、lsしたりfindしたり探してみても見つからないので、それよりcreate_project.pyを使いませんか、となるわけです。
macの場合、ターミナルを開き、cocos2d-xを解凍したフォルダで./tools/project-creator/create_project.pyを実行すればフロントエンドが立ち上がります。
あとは必要事項 - Project Nameに任意のプロジェクト名、Package Nameはandroid用のパッケージ名(必要ないならデフォルト、とりあえずならBundle Identifierなど)、Project Pathに任意のフォルダ、LanguageでC++ or Lua or JavaScript - を指定して[create]ボタンを押せば$(ProjectPath)/$(ProjectName)が生成されます。
あとは必要なプラットフォームのプロジェクトを開いて編集すればオーケー。
実際、lsしたりfindしたり探してみても見つからないので、それよりcreate_project.pyを使いませんか、となるわけです。
macの場合、ターミナルを開き、cocos2d-xを解凍したフォルダで./tools/project-creator/create_project.pyを実行すればフロントエンドが立ち上がります。
あとは必要事項 - Project Nameに任意のプロジェクト名、Package Nameはandroid用のパッケージ名(必要ないならデフォルト、とりあえずならBundle Identifierなど)、Project Pathに任意のフォルダ、LanguageでC++ or Lua or JavaScript - を指定して[create]ボタンを押せば$(ProjectPath)/$(ProjectName)が生成されます。
あとは必要なプラットフォームのプロジェクトを開いて編集すればオーケー。
登録:
投稿 (Atom)