Cocos2d-x v2 への移行メモ


ソースをダウンロード

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 触ってなかったし、自分の書いたコードもだいぶ忘れてたのでまあプロジェクトを生成して、そこに自分のソースを流し込みました。

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

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

Project と Target の設定

  • [Project] iOS Development target は最新のバージョンにしておけばOK
  • [Project] の設定は…これくらいしかしてないな…
  • [Target] Summery > Bundle identifer を設定。Info の方もいじらないとダメ。
  • [Target] Summery > Development Target を 4.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_TEXEL を1に変更。
※自分のプロジェクトだと拡大縮小すると線が出てしまうので…TexturePacker使えば治るかな。

EAGLView.h の canBecomeFirstResponder

EAGLView がFirstResponderに設定されているため iAd などでキーボードが出てしまう問題…
ver1のときは http://sarudeki.jp/fernweh/cocos2dx-iad-canbecomefirstresponder/ みたいにして対応してたけど…
この部分のコードがちょっと変わっていた。

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::ccTime は flaot に置き換えた。。

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::spriteWithFile は CCSprite::create に変更されてたり、
CCFadeIn::actionWithDuration が CCFadeIn::create に変更されてたり、
CCTransitionCrossFade::transitionWithDuration が CCTransitionCrossFade::create に変更されてたりとかする。
とりあえず スタティックイニシャライザ は create という名前に変更されている可能性が高いと思えばよさそう。

CCMutableArray および CCMutableDictionary

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

CCMutableArray::arrayWithObjects は CCArray::create に置き換える。

CCRect::CCRectContainsPoint は非推奨に

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

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

  • CCApplication の getCurrentLanguageとか

CCFileUtils が static なクラスから シングルトン に。そして 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*** にリネーム。
  1. バージョン2.2 になってinstall-templates-xcode.sh が消えた。
    参考リンク:http://verytired.hateblo.jp/entry/2013/10/09/011413

  2. というかバージョン2.1.5も消えてた。バージョン2.1.4はあるので2.1.5以降は無いということで。

  1. トラックバックはまだありません。

*


Advertisement