cocos2d-x 3.0深入了解之一
来源:互联网 发布:正版手柄淘宝店 编辑:程序博客网 时间:2024/04/29 00:42
1、CCPlatformConfig.h文件
里面定义了不同平台的宏:
2、ccConfig.h文件
定义了CC_ENABLE_STACKABLE_ACTIONS //行动是可以累加的
比如定义了(MoveBy,JumpBy,BezierBy)三个行动,节点Node会执行这三个行动,
如果没有定义,则只会执行BezierBy这个行动。行动累加器是默认打开的。
CC_DIRECTOR_FPS_INTERVAL 定义间隔多少时间更新一次FPS
CC_DIRECTOR_FPS_INTERVAL (0.1f)表示0.1秒更新一次FPS
CC_DIRECTOR_DISPATCH_FAST_EVENTS 定义每隔0.04秒分发所有的事件。如果
在程序中使用了很多的事件,那么使用这个宏是一个好主意。这个定义正在测试,默认是关闭的
CC_SPRITE_DEBUG_DRAW 定义在画sprite或者他的子类时,是否画出他的边框。默认是关闭的。
3、CCRef.h文件
Clonable类:定义怎样复制Ref类的接口
virtual Clonable *clone() const =0; //克隆函数是纯虚函数,必须在子类重写
例:
virtual __Array *clone() const;
实现:
__Array* __Array::clone() const
{
__Array* ret = new __Array();
ret->autorelease();
ret->initWithCapacity(this->data->num > 0 ? this->data->num : 1);
return ret;
}
4、Ref类
void retain(); //保持所有权,增加Ref的引用次数
void release(); //减少引用次数,如果引用次数等于0,立即释放
错误用法(一)
auto obj=Node::create(); //Ref=1,但是当前Node已经在自动释放缓冲池中
obj->autorelease(); //错误:如果你调用autorelease()很多次,你必须retain()
引申:
当前的类都是这样写的:
Layer *ret=new Layer()
if(ret && ret->init())
{
ret->autorelease();
return ret;
}
void release()和void autorelease()
release()方法是引用计数直接减一,而autorelease()方法是将该物体加入自动释放池,
当引用计数为0时自动释放
typedef void (Ref::*SEL_CallFuncN)(Node*);//void为返回值,(Ref::*SEL_CallFunc)为函数的指针,(Node *)为形参
回调函数:
listener->onTouchBegan = CC_CALLBACK_2(CAlarmClock::onTouchBegan, this);
bool CAlarmClock::onTouchBegan(Touch *touch, Event *event);
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
其中&__selector__就是CAlarmClock::onTouchBegan,__target__是this,std::placeholders::_1和std::placeholders::_2是两个自己定义的回调函数的参数(不事先指定,有两个,对应CC_CALLBACK_后面的数字2),
即Touch *touch, Event *event
事先指定的参数有任意多个,且不事先指定放在事先指定的前面。
例子:
- // a selector callback
- void menuCloseCallback(Object* pSender,int a,int b);
- void HelloWorld::menuCloseCallback(Object* pSender,int a,int b)
- {
- std::cout<<a<<" "<<b<<std::endl;
- Director::getInstance()->end();
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- }
- auto closeItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- CC_CALLBACK_1(HelloWorld::menuCloseCallback,this,1,2));
//lambda表达式
auto closeItem=MenuItemImage::create("CloseNormal.png",
"CloseSelected.png",
[&](Ref *sender)
{
Director::getInstance()->end();
}
);
关于回调函数:http://blog.csdn.net/crayondeng/article/details/18767407
关于c++11新特性:http://blog.csdn.net/crayondeng/article/details/18563121
关于回调函数还会在下面详解。
5、CCAutoreleasePool.h文件
AutoreleasePool类:
警告:不要在堆中创建自动释放池而应该在栈中创建。
堆和栈的区别:参考文章http://blog.csdn.net/hairetz/article/details/4141043
加入自动释放Object(Ref)的数组,以及该自动缓冲池的名字
std::vector<Ref*> _managedObjectArray;
std::string _name;
从其构造函数中可以看出:
AutoreleasePool::AutoreleasePool(const std::string &name)
: _name(name)
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
, _isClearing(false)
#endif
{
_managedObjectArray.reserve(150);
PoolManager::getInstance()->push(this);
}
_name是当前缓冲池的名字,该缓冲池有150个物体可以加入,并把该缓冲池
加入缓冲管理器!
在c++11中for有一种新的写法,以 bool contains(Ref* object) const;为例
bool AutoreleasePool::contains(Ref* object) const
{
for (const auto& obj : _managedObjectArray) //循环_managedObjectArray,直到找到想要的object为止
{
if (obj == object)
return true;
}
return false;
}
void dump();方法是在log中打印出当前类所生成对象的详细信息。
PoolManager类:管理自动缓冲池的类。
总结:当前只有一个自动缓冲池管理类,可以管理许多自动释放缓冲池,每个自动释放缓冲池
可以加入许多Object(Ref)
6、CCStdC.h文件
CCPlatformMacros.h文件
为一种特别的类型定义create函数:
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
#define NS_CC_BEGIN namespace cocos2d {
#define NS_CC_END }
#define USING_NS_CC using namespace cocos2d
7、CCActionInstant.h文件
static CallFunc * create(const std::function<void()>& func); 例:CallFuc::create(CC_CALLBACK_0,TransitionScene::finish),this);
其中TransitionScene::finish函数不含参数
8、CConsole.h文件
CCConsole类:CCConsole是一个帮助开发者控制TCP连接的类
listener->onTouchBegan = CC_CALLBACK_2(CAlarmClock::onTouchBegan, this);
bool CAlarmClock::onTouchBegan(Touch *touch, Event *event);
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
其中&__selector__就是CAlarmClock::onTouchBegan,__target__是this,std::placeholders::_1和std::placeholders::_2是两个自己定义的回调函数的参数,即Touch *touch, Event *event
关于回调函数还会在下面详解。
- cocos2d-x 3.0深入了解之一
- cocos2d-x 3.0深入了解之二
- cocos2d-x 3.0深入了解之三
- cocos2d-x 3.0深入了解 --- 四
- cocos2d-x 3.0深入了解之五
- 深入了解Cocos2d-x中几个代表性的类
- 深入了解Java之一
- 【cocos2d-x 3.0之一】一些小变化
- cocos2d-x学习之一
- 【深入了解cocos2d-x 3.x】UI树(1)——什么是UI树
- 【深入了解cocos2d-x 3.x】如何进行合理的内存分配
- 【深入了解cocos2d-x 3.x】内置数据结构(1)——智能指针
- 【深入了解cocos2d-x 3.x】内置数据结构(2)——Map
- 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(1)
- 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(2)
- 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)
- 【cocos2d-x】cocos2d-x学习笔记之一
- NVMain运行机制深入了解之一
- POJ 2002 Squares hash求正方形个数
- 机器学习系列(4):混合高斯模型+EM+K-means算法
- 强关联规则是否都是有趣的?
- 百日灸怎么样
- Java中Set的使用
- cocos2d-x 3.0深入了解之一
- 语义化你的HTML 标签
- hdu-1556 Color the ball && nyoj -123 士兵杀敌(四)----------》树状数组
- Unity3d 载入 C++/CLI (托管模式c++) 的动态库(DLL)
- 在時光的沉澱下
- 操作系统的线程管理机制以及Thread.Sleep()的作用
- 大话设计模式之代理模式
- 插入排序(c语言版)
- error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义