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


事先指定的参数有任意多个,且不事先指定放在事先指定的前面。

例子:

  1. // a selector callback  
  2.     void menuCloseCallback(Object* pSender,int a,int b);  


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void HelloWorld::menuCloseCallback(Object* pSender,int a,int b)  
  2. {  
  3.     std::cout<<a<<"  "<<b<<std::endl;  
  4.     Director::getInstance()->end();  
  5.   
  6. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)  
  7.     exit(0);  
  8. #endif  
  9. }  
注意到在回调函数中输出 a b

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. auto closeItem = MenuItemImage::create(  
  2.                                            "CloseNormal.png",  
  3.                                            "CloseSelected.png",  
  4.                                            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

关于回调函数还会在下面详解。

0 0