読者です 読者をやめる 読者になる 読者になる

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のコードだとまずこのコードの置き直しで迷う。

@protocol irofDelegate <NSObject>
@optional
- (void)clear;
- (void)clearAt:(float)time;
@end

=>

class irofDelegate {
public:
	virtual void clear();
	virtual void clearAt(float time);
};
@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; }
@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:でも◎◎のような書き方はしないらしい<汗