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のイベントリスナー対応、など

2014年2月27日木曜日

[cocos2d-x v3.0beta2] XTLayerを(とりあえず)動かす

 cocos2d-xでタップやスワイプを手軽に実装できるXTLayerをv3.0でも使いたい。というわけで手抜き移行を実施。

 移行に際してやったことは以下の3点。
  • v3.0準拠へ各種名称およびコンテナを変更
  • deprecatedsetTouchEnabledおよび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を別途実装して対処する予定。

[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)が生成されます。

 あとは必要なプラットフォームのプロジェクトを開いて編集すればオーケー。