IPhoneのアプリをcocos2d-xに移植するにあたってのメモ(1)
自メモ)
結構苦しんでます><。
XCode開発者じゃないと厳しいって話は実際本当みたい。。。
1日で出来る〜あたりの記事を上が鵜呑みにして
進捗悪くて何時も怒られてるからかなり胃が痛いなorz
1)変数の置き直し的な奴
- cnv_def.h
#define BOOL bool #define YES true #define NO false #define nil nullptr #define LOG CCLOG #define NSLog CCLOG #define UInt32 unsigned int #define RGBA Color4B #define RGB Color3B
2)ログ出力とかで使われてる文字列の定義
下記みたいなのはエラーになる
LOG(@"time:%.3f", time); とか LOG(@"obj %@", obj);
=>
LOG("time:%.3f", time); とか LOG("obj %d", obj);
とかに修正しないと駄目。
Objectとかどうdumpすればいいのかなー
cocos2d-x JSBだと簡単にdump出来るらしいんですけどね。。><
3)Delegate
IOSのコードだとまずこのコードの置き直しで迷う。
- Delegate宣言部
@protocol irofDelegate <NSObject> @optional - (void)clear; - (void)clearAt:(float)time; @end
=>
class irofDelegate { public: virtual void clear(); virtual void clearAt(float time); };
- Delegateセットされる方
@interface irofHistory : NSObject { int data; } @property (assign) id <irofDelegate> delegate; @property (nonatomic, readonly) int level_max; @property (nonatomic, assign) int level; -(void)show; -(int)setPos:(int)x y:(int)y; @end
=>
class irofHistory:public irofDelegate //delegate継承 { public: CC_SYNTHESIZE(irofDelegate*,delegate,Delegate); CC_SYNTHESIZE_READONLY(int,level_max,LevelMax); CC_SYNTHESIZE(int,level,Level); //hogeDriven自体の関数 void show(); int setPos(int x,int y); protected: //hogeDriven自体の内部変数 int data; private: //delegate関数(呼ぶだけならこの形でOK) void clear(){ if(delegate!=nullptr){delegate->clear();} }; void clearAt(float time){ if(delegate!=nullptr){delegate->clearAt(time);} };
備考)
- cocos/base/CCPlatformMacros.h
CC_PROPERTY_READONLY
CC_PROPERTY
を使って @property を置き換えるイメージに
=>
訂正>
現在のXCodeだと @propertyでも getter/setter を作るイメージですが
昔の奴だと 宣言だけでこのcocos2d-xの CC_PROPERTY はその頃から更新されていないっぽい。
従って
CC_SYNTHESIZE系で置き直すのがベターとのこと。
- CCPlatformMacros.h
#define CC_PROPERTY(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void);\ public: virtual void set##funName(varType var); #define CC_SYNTHESIZE(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void) const { return varName; }\ public: virtual void set##funName(varType var){ varName = var; }
- Delegateを利用する方
@interface hogeDriven : UIView<irofDelegate> { irofHistory* history; } @property (assign) id <irofDelegate> delegate; @end
=>
class hogeDriven: public cocos2d::Layer, public irofDelegate { public: virtual bool init(); virtual void onExit(); CREATE_FUNC (hogeDriven); CC_SYNTHESIZE(irofDelegate*,delegate,Delegate);//◎◎ protected: irofHistory* history; private: //delegate関数(UIの処理を書くなら宣言部のみ) void clear(); void clearAt(float time); }
hogeDriven.cpp側に
bool hogeDriven::init(){ irofHistory = new irofHistory(); irofHistory.setDelegate(this); //irofHistory.delegate = this; this->setDelegate(this);//自分の参照をセット return true; } //UIが絡んだ処理等 (initでthisを代入してるのでココで実処理を書く) //◎◎を追加した場合。 //自分が参照してたソースはこうなってたけど //実際はこういう記述はしないらしい。 //IOSでは普通に書けるらしいんだけど,,,,,,, // void hogeDriven::clear(){ } void hogeDriven::clearAt(float time){ }
でもコレってIOSのコードに慣れてる人ならスッキリするって感じで*1
書かれるコードらしいんで、
別言語書いてる人には違和感ありまくりなんだよな。。。
JSイメージとかだと普通にCALLBACK書きまくってたほうが
全然違和感ないかもしれぬ。
*1:でも◎◎のような書き方はしないらしい<汗