cocos2dx 原理性研究

1、cocos2dx Ref 详解

这个帖子对ref的机制和原理描述的很详细。比较侧重讲原理。 http://blog.csdn.net/tonny_guan/article/details/40790751

比较侧重细节讲实现机制。 http://www.cocoachina.com/bbs/read.php?tid-298502.html

new/retain()与autorelease()/release()使用时要成对出现,否则容易造成内存泄漏。

2、回调函数机制

2.1、C++11 std::bind机制

《std::function与std::bind 函数指针》 http://blog.csdn.net/qq575787460/article/details/8531397

2.2、CCCALLBACK* 机制(cocos2dx 3.x 回调机制

2.2.1、实现了一个ImageView类型的回调功能代码如下

(1)、在初始话函数中设置回调函数:

m_pGoodsImage->addClickEventListener(CC_CALLBACK_1(TaskPage::onClickedGoodsImage,this));

CC_CALLBACK_1标明这个回调函数有一个参数,通过(2)中内容可以知道,这个参数是Ref* sender

(2)、实现onClickedGoodsImage函数

/*
函数功能:处理点击商品图片
*/
void TaskPage::onClickedGoodsImage(Ref* sender)
{
    log("call onClickedGoodsImage ");

}

(3)、ImageView 的addClickEventListener函数的定义

void addClickEventListener(const ccWidgetClickCallback& callback);

参数中的函数指针类型是:const ccWidgetClickCallback& callback 其定义为:

typedef std::function<void(Ref*)> ccWidgetClickCallback;

函数有一个Ref*类型的指针,返回值为void。

2.2.、核心

#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
m_pGoodsImage->addClickEventListener(CC_CALLBACK_1(TaskPage::onClickedGoodsImage,this));

“TaskPage::onClickedGoodsImage” 对应的是“selector” “this”对应的是“target”,表示包含对成员函数的对象的指针

2.3、schedule_selector机制(cocos2dx 2.x回调机制)

老的机制可以参照这篇文章 http://blog.csdn.net/dawn_moon/article/details/8546607

核心:

typedef void (Ref::*SEL_CallFunc)();
typedef void (Ref::*SEL_CallFuncN)(Node*);
typedef void (Ref::*SEL_CallFuncND)(Node*, void*);
typedef void (Ref::*SEL_CallFuncO)(Ref*);
typedef void (Ref::*SEL_MenuHandler)(Ref*);
typedef void (Ref::*SEL_SCHEDULE)(float);

使用typedef方式定义函数指针,且所指向的函数是Ref类的成员函数(包括Ref类的子类型的成员函数)

2.4、关于lambda的使用

changeBoneDispBtn->addClickEventListener(weapSkinToAdd, weaponHandeBone { // or use skeletonNode->display(bone name, skin name, hide) if (weapSkinToAdd->isVisible()) weaponHandeBone->displaySkin("3", true); else { weaponHandeBone->displaySkin(weapSkinToAdd, true); } });