cocos2d-x知识总结

cocos2d-x知识总结,第1张

概述原文出处:http://www.yxkfw.com/?p=15346 1. CCMoveTo动作运行多次,位置会发生诡异的变化,比如变成目标位置的几倍。解决办法,确保每次CCMoveTo之前停止之前的动作。 2. 在onEnter()函数中,忘记调用父类的onEnter()函数会导致动画等无效。还有在init()函数中,谨记要对父类进行初始化。 3. addChild(CCNode* child,

原文出处:http://www.yxkfw.com/?p=15346

1. CCMoveto动作运行多次,位置会发生诡异的变化,比如变成目标位置的几倍。解决办法,确保每次CCMoveto之前停止之前的动作。

2. 在onEnter()函数中,忘记调用父类的onEnter()函数会导致动画等无效。还有在init()函数中,谨记要对父类进行初始化。

3. addChild(CCNode* child,int zOrder); zOrder的值越大,显示的位置越靠前。

4. 两个常用命名空间宏:

#defineUSING_NS_CCusingnamespacecocos2d #defineUSING_NS_CC_EXTusingnamespacecocos2d::extension

Cocos2d-x提供的日志输出函数:cclOG

5. CC_BREAK_IF:

#defineCC_BREAK_IF(cond)if(cond)break

6. 关于do…while(0)或do…while(false)语句的一些特殊作用:

(1)提高代码健壮性。

情况一,代码执行中提前退出函数,不执行循环体中后面的部分代码,转而直接执行循环体外后面的代码,当然用goto语句也可以实现这一目的。

somecode… do{ CC_BREAK_IF(如果出错,跳出while循环); //…另一些语句,如果跳出循环后,这些语句将不会执行,从而执行循环体外后面的代码 }while(0); somecode…

(2)用于宏定义,#define marcRO(para) do{macro content}while(0)的格式,原因如下:

a、避免空的宏定义产生warning,如:#define fun() do{}while(0);

b、存在一个独立的block,可用来进行变量定义,进行复杂实现;

c、如果出现在判断语句过后的宏,用do{}while(0)包起来可以保证宏作为一个整体来实现,如:

#definefun()/ fun1();/ fun2(); if(cond==true) fun();

在上面情况使用以上宏,就会导致fun1()和fun2()不会被同时执行的情况,不符合预期目的。

d、以上情况使用单独的{}包括宏也可以实现预期目的,但是为什么一定要用do{}while(0)?

#defineswap(x,y){inttmp;tmp=x;x=y;y=tmp;} if(x>y) swap(x,y); else otherfun();

以上代码会因为多出一个分号报错。 而使用do{}while(0)语句包起来,成为一个独立的语法单元,避免与上下文混淆。而且绝大多数编译器都能识别do{}while(0)这种无用的循环并进行优化,所以这样使用不会导致程序的性能降低。当然,养成在每个判断语句后加上{}的习惯也能解决该问题。但是,在设计library的时候,不能指望library的使用者会有这种代码规范习惯,要提高程序的健壮性,避免编译出错。

7.C++中单例的实现

classDataManager { private: DataManager();//构造函数定义为私有,防止外部调用 ~DataManager(); public: staticdataManager*instance(); staticvoIDdestroyInstance(); } DataManager::DataManager() { } DataManager::~DataManager() { } staticdataManager*gDataManager=NulL; DataManager*DataManager::instance(){ if(!gDataManager){ gDataManager=newDataManager(); } returngDataManager; } voIDDataManager::destroyInstance() { if(gDataManager){ deletegDataManager; gDataManager=NulL; } }
8、Cocos2d-x的内存管理机制基本跟Objective-C语言一样,都是采用引用计数的内存管理机制。Cocos2d-x一般采用autorelease()即自动释放的对象,Cocos2d-x将会在每一帧结束后释放一次内存池,并在下一帧开始前创建一个新的回收池,回收池维护着一个自动释放 *** 作的对象列表,如果一帧内生成了大量autorelease对象,会导致性能下降。因此,在生成autorelease对象密集的区域(通常是循环中)的前后,我们最好可以手动创建并释放一个回收池,并且如果循环数过大,可以将每次循环都创建并释放一次回收池。
//情况一: CCArray*strArray=CCArray::createWithCapacity(0); CCPoolManager::sharedPoolManager()->push();//压入一个自动回收池到回收池栈的顶端,autorelease对象仅会添加到顶端的池中 for(inti=0;i<1000;i++){ CCString*str=CCString::createWithFormat(“%d”,i); strArray->addobject(str); } CCPoolManager::sharedPoolManager()->pop();//顶层的回收池释放,内部所有对象被释放一次,此后出现的autorelease对象则添加都下一个池中 //情况二: CCArray*strArray=CCArray::createWithCapacity(0); for(inti=0;i<100000000;i++){ CCPoolManager::sharedPoolManager()->push(); CCString*str=CCString::createWithFormat(“%d”,i); strArray->addobject(str); CCPoolManager::sharedPoolManager()->pop(); }

一般函数的返回值都用autorelease对象。

9、跟Objectiv-C的属性对象赋值一样,Cocos2d-x的set方法赋值也要注意内存的管理

voIDAClass::setobject(CCObject*pObj) { this->object->autorelease(); pObj->retain(); this->object=pObj; } voIDAClass::setobject(CCObject*pObj) { if(this->object!=pObj){ this->object->release(); pObj->retain(); this->object=pObj; } }

10、一些内存管理的宏:

CC_SAFE_DELETE(p) //delete一个C++对象p,如果p为NulL则不 *** 作,下同 CC_SAFE_DELETE_ARRAY(p) //delete[]一个C++数组p CC_SAFE_FREE(p) CC_SAFE_RELEASE(p) CC_SAFE_RELEASE_NulL(p) CC_SAFE_RETAIN(p)

11、Cocos2d-x提供了一套类似Objective-C语言的容器类,CCArray、CCDictionary,用法也基本跟Objective-c的NSMutableArray,NSMutableDictionary一样。还提供了CCARRAY_FOREACH(__array__,__object__)函数方便遍历CCArray.

12、导演、场景、层、精灵、纹理:导演是控制游戏流程的主要组件,游戏流程控制通过在场景间的切换实现,通常,场景包含层,层包含精灵,场景与层是其他游戏元素的容器,层处理触摸事件、加速度计事件、键盘输入事件,而精灵是展示给玩家的图形,纹理是图片。

节点和渲染树:一切可以显示的游戏元素都是渲染树的节点。

动作:作用于游戏元素,规定了游戏元素运动的方式。帧动画是作用于精灵的一种特殊动作。

13、Cocos2d-x中存在两种坐标系,一种是绘图坐标系,与OpenGL采用的坐标系相同,以左下角为原点,向右为x轴正向,向上为y轴正向;另外一种坐标系是纹理坐标系,纹理坐标系以左上角为坐标原点,向右为x轴正向,向下为y轴正向,只有从纹理中截取部分矩形时才使用这个坐标系。

14、锚点AnchorPoint用于设置一个描点,取值为0到1之间的实数,表示锚点相对于节点长宽的位置。锚点(0,0)表示锚点在节点左下角,(1,1)表示锚点在节点右上角

15、定时器事件:(1)CCNode的update()方法,每帧都会调用 (2)CCNode的schedule()方法

16、onEnter() 当此节点所在场景即将呈现时,会调用此方法。

onEnterTransitionDIDFinish() 当此节点所在场景的入场动作结束后,会调用此方法。如果所在场景没有入场动作,则此方法会紧接着onEnter()后被调用 onExit()当此节点所在场景即将退出时调用 onExitTranshitionDIDStart() 当此节点所在的出场动作结束后会调用此方法。如果所在场景没有出场动作,则此方法会紧接着onExit()后被调用。

17、特殊的cclayer:

cclayercolor:带背景色的层 cclayerGradIEnt:能设置两种渐变色的层 Ccmenu:游戏菜单,分为菜单项和菜单本身,CcmenuItem是一个菜单项,相当于一个按钮。 总结

以上是内存溢出为你收集整理的cocos2d-x知识总结全部内容,希望文章能够帮你解决cocos2d-x知识总结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1018841.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存