Cocos2d-x v2 への移行メモ

半年くらい放置していたものをメンテナンスしようかと Cocos2d-x 1.0.11 -> 2.0.3 にバージョンアップしたメモ。

ソースをダウンロード

Cocos2d-x | Downloadのページから最新のものをダウンロードして、テキトーなフォルダに解凍

テンプレートの更新 (for Xcode)

解答した中に install-templates-xcode.sh があるのでこれを実行する。

ターミナルを開いて

cd 解答してできたフォルダ
sudo ./install-templates-xcode.sh -f

-f オプションは既にテンプレートがある場合に、強制的に上書きするオプションなので、初めてインストールする場合は不要。

Xcode でインストールしたテンプレートからプロジェクトを作成

Android での開発するつもりがなければ、テンプレートからプロジェクトを作成する

Android プロジェクトとしても利用する場合はcocos2d x」の開発環境が更に快適に! -Xcode4対応版|マルチデバイスLab. - Multi Device Lab.が参考になりそうです。

プロジェクトを生成せずに、ただcocos2d-xのソースだけを入れ替えればいいのですけどね。 半年くらい Xcode 触ってなかったし、自分の書いたコードもだいぶ忘れてたのでまあプロジェクトを生成して、そこに自分のソースを流し込みました。

ということでプロジェクトに移し替えのメモ

久しぶりに触ったらいろいろ忘れすぎ。

ProjectTarget の設定

  • [Project] iOS Development target は最新のバージョンにしておけばOK
  • [Project] の設定は…これくらいしかしてないな…
  • [Target] Summery > Bundle identifer を設定。Info の方もいじらないとダメ。
  • [Target] Summery > Development Target4.0 に。Version, Build, Devices は適切に設定。
  • [Target] Summery > Support Device Orientation : 向きを指定する場合はココで。
  • [Target] URL Types : カスタムURLスキームを使うなら…今んとこ使ってないのでイラネ
  • [Target] BuildSettings > Archtectures : armv6, armv7 を指定する。
  • [Target] Build Phases > Link Binary With Libraries : 必要なライブラリを追加しておく > Security.framework, StoreKit.framework, Twitter.framework, GameKit.framework, SystemConfigration.framework, Message.framework, iAd.framework

プロジェクトにソースをコピー

ソースコードやリソースのファイル・フォルダをコピーして Xcode でプロジェクトに反映される。

ccConfig.h

CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL1 に変更。 ※自分のプロジェクトだと拡大縮小すると線が出てしまうので… TexturePacker 使えば治るかな。

EAGLView.hcanBecomeFirstResponder

EAGLViewFirstResponder に設定されているため iAd などでキーボードが出てしまう問題… ver1 のときは このように にして対応してたけど… この部分のコードがちょっと変わっていた。

AppController

  • EAGLView#viewWithFrame の引数をテキトーなものに変更する。
  • まぁその他いろいろいじってる

CCApplication_***

CCApplication も弄っているので、変更している部分を移し替える。

また、CCApplication_ios.h/m などの クラス名_+プラットフォーム名の略語 のファイル名が変更された。 アンダーバー移行のサフィックスは消したようだ。

プレフィックスヘッダー

Prefix.pch はデフォルトだと

#ifdef __OBJC__
	#import <Foundation/Foundation.h>
	#import <UIKit/UIKit.h>
#endif

テキトーに必要なのを加える

#ifdef __OBJC__
	#import <Foundation/Foundation.h>
	#import <UIKit/UIKit.h>
	#import <StoreKit/StoreKit.h>
	#import <Twitter/Twitter.h>
	#import <Accounts/Accounts.h>
	#import <GameKit/GameKit.h>
	#import <SystemConfiguration/SystemConfiguration.h>
	#import <MessageUI/MessageUI.h>
	#import <iAd/iAd.h>
	#import <Security/Security.h>
#endif

#include "cocos2d.h" って加えてみたけど…コンパイル通らねぇ… #import が使えないし無理なのかな…

テキトーにいじってる部分を変更する

  • RootViewController.mm の向きとか
  • AppDelegate の初期化の設定とか

CCLabelBMFont

以前は ASCII 以外の文字に対応してなかったんだけど対応しているらしい。また、以前は扱える 文字コードの最大値を定数で設定して、 その定数分の設定を全てメモリに保持する(その文字が存在しなくてもメモリを消費)という感じでしたが、この定数も消えているみたい。 おそらく、.fnt ファイルで定義されているものだけデータを保持するようになっているんじゃないかなと予想…(ソースは見てません)。

そういうことで ASCII 以外の文字を扱う場合でも余計な小細工は不要になった。

エラーを全て消す

コンパイルを実行すると…エラーが出まくるのでそれらを全て消す。

cocos2d::ccTime 型 が消えた

よくわからないけど float 型に統一されたようだ。テキトーにググってみたんだけどなんでだろうね。理由はよくわかんない。 そういうことで cocos2d::ccTimeflaot に置き換えた。。

cocos2d::selectorProtocol が消えた

performSelector 的な動作をさせたいクラスには cocos2d::selectorProtocol が継承されていないとダメだったけど、どうやら cocos2d::CCObject に統合されたらしい。 そういうことで cocos2d::selectorProtocol を引数にしている部分は cocos2d::CCObject に変更する。 cocos2d::selectorProtocol を継承しているクラスは cocos2d::CCObject に変更する。

LAYER_NODE_FUNC が消えた

代わりに CREATE_FUNC を使用すればOK

cocos2d::CCApplication::sharedApplication() の返り値の変更

参照が帰ってきていたのがポインタに変更された。

CCActionManager, CCScheduler, CCTouchDispacher の行方

こいつらは CCDirector シングルトンのメンバになった。ということで たとえば CCScheduler::sharedScheuler() とかしてた場合は CCDirector::sharedDirector()->getScheduler() って変更しないとダメ

CCSpriteBatchNode からスプライトを生成するメソッド名などの変更

CCSprite::spriteWithBatchNode(pBatchNode, rect) は消えて… CCSprite::createWithTexture(pBatchNode->getTexture(), rect) に変更となった。 CCSprite::spriteWithTexture(pBatchNode->getTexture(), rect) もあるけど非推奨。

他にも… CCSprite::spriteWithFileCCSprite::create に変更されてたり、 CCFadeIn::actionWithDurationCCFadeIn::create に変更されてたり、 CCTransitionCrossFade::transitionWithDurationCCTransitionCrossFade::create に変更されてたりとかする。 とりあえず スタティックイニシャライザ は create という名前に変更されている可能性が高いと思えばよさそう。

CCMutableArray および CCMutableDictionary

これらは削除されたので、替わりに CCArray, CCDictionary に変更すればほとんど問題ない。 CCArray, CCDictionary はテンプレートが使えないので 取得時にキャストする必要があるのと、 CCDictionary のキーは int or string のどちらかになっていて、intstring を使うのかはプログラマが覚えておいてコントロールする必要がある。

CCMutableArray::arrayWithObjectsCCArray::create に置き換える。

CCRect::CCRectContainsPoint は非推奨に

CCRect::CCRectContainsPoint(&rect, &point) は非推奨になったので代わりに、 rect.ContainsPoint( &point ) を使用する。

static メソッドが static じゃなくなってたり

  • CCApplicationgetCurrentLanguage とか

CCFileUtilsstatic なクラスから シングルトン に。そして CCFileData は消えた。

CCFileUtils::メソッド() みたいな呼び出しはできなくなった。 CCFileUtils->sharedFileUtils()->メソッド() を替わりに使えば良い。

で、ファイルパスから データを取得する際に CCFileData は使えなくなったので替わりに、 CCFileUtils#getFileData(const char * ファイル名, const char * ファイルを開くモード, unsigned long * 成功時にここで渡したポインタにデータ長がセットされる) を使う。

デバイスの向き

  • x では CCDirector::sharedDirector()->setDeviceOrientation( 向きの定数 ) でもデバイスの向きを指定しなければダメだったけど、
  • x では RootViewController shouldAutorotateToInterfaceOrientation のみの設定でOK。 ということで setDeviceOrientation メソッドは消せばいい。

Retina 対応は…?

-hd サフィックスとかをつけてたけどこれは消えた。どうなるかというと

CCFileUtils::setResourceDirectory(ディレクトリ名); を指定すると、 /Resource/ディレクトリ名/ の中の画像を取りに行くようになった。

CCApplication::sharedApplication()->getTargetPlatform() なんかでデバイスを判別して使用するフォルダを setResourceDirectorym で指定するという方式になった。サフィックス指定でいい気がするんだけどまぁいいか…

その他

  • pDirector->setDisplayFPS()->setDisplayStats() にリネームする。
  • CCScene::node()CCScene::create() にリネームする。
  • setIs**** みたいなメソッド名は set*** にリネーム。
Share