cocos2d-x知识总结

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

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

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

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

#define  USING_NS_CC using namespace cocos2d
#define USING_NS_CC_EXT using namespace cocos2d::extension

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

5. CC_BREAK_IF:

#define CC_BREAK_IF(cond)            if(cond) break

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

(1)提高代码健壮性。

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

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

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

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

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

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

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

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

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

#define swap(x, y) {int tmp; 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是一个菜单项,相当于一个按钮。

转载于:https://www.cnblogs.com/Anzhongliu/p/6091807.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之判断一棵树是不是完满二叉树

1 完满二叉树 除了叶子结点之外的每一个结点都有两个孩子结点。 如下是完满二叉树 12 34 56 7 2 分析 我们按层(queue)遍历数,如果发现左子树为空右子树不为空 或者 左子树不为空右子树为空 的情况下直接返回…

php基础教程 第二步 通俗易懂的学习变量、常量与数据类型

简介 变量、常量以及数据类型 在编程中&#xff0c;变量指一个存储值的一个盒子&#xff0c;或者说容器。例如一个箱子&#xff0c;用来放杂物&#xff0c;这个箱子就是一个容器&#xff0c;值就为杂物。容器可以分为很多类型&#xff0c;例如瓶子、被子、盒子等。值也有很多类…

ArcGIS实验教程——实验三:矢量数据采集与编辑(矢量化)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 扫描矢量化是常见的GIS数据采集方法之一,在实际工作中很常见。有些人觉得数字化就是听着歌点鼠标,其实不然。数字化是GISer的基本功。掌握数字化的基本方法,熟练的进行数字化在实际工作中显得尤为…

可见光能量范围_JACS:游书力团队通过可见光促进的吲哚衍生物分子内去芳构化合成环丁烷稠合的四环吲哚螺环...

点击上方了解化学加VIP会员企业导读近日&#xff0c;中国科学院上海有机所游书力团队开发了一种可见光促进的吲哚衍生物分子内[22]环加成方法&#xff0c;可以极好的收率和立体选择性得到环丁烷稠合的四环吲哚螺环(Scheme 1&#xff0c;底部)。该成果近期发表在J. Am. Chem. So…

章鱼黑的第一篇博客~

Part One&#xff1a;结缘计算机 推荐博客&#xff1a;https://book.douban.com/subject/4006425/discussion/22803961/ 从踏入大学的第一天&#xff0c;我就对这一专业充满了好奇与兴趣。我之所以会选择计算机这个专业&#xff0c;是因为从小对电脑的喜爱&#xff0c;再加上现…

记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

在经过了两年的准备&#xff0c;以及迁移了几个应用项目积累了让我有信心的经验之后&#xff0c;我最近在开始将团队里面最大的一个项目&#xff0c;从 .NET Framework 4.5 迁移到 .NET 6 上。这是一个从 2016 时开始开发&#xff0c;最多有 50 多位开发者参与&#xff0c;代码…

1Android系统移植与驱动开发概述

1、Android系统架构分为四层&#xff0c;从下至上依次为Linux内核层&#xff0c;C/C代码库、Android SDK API、应用程序&#xff0c;要熟悉每一层的内容以及功能&#xff1b; 2、Android移植分为应用移植和系统移植&#xff0c;系统移植的主要工作是移植Linux驱动和移植HAL&…

数据结构之堆排序

1 堆排序 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点,我们可以理解构建的堆是 完全二叉树 ,它们的下标有如下性质 完全二叉树还有这…

ArcGIS实验教程——实验一:ArcGIS软件的认识与使用

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 实验目录 第一节 Esri简介 1.1 ESRI简介 1.2 Esri产品发展历程 第二节 ArcGIS简介 2.1 ArcGIS简介 2.2 ArcGIS产品体系 第三节 Desktop简介 3.1 Desktop简介…

10分钟学会vue滚动行为

滚动行为 什么是路由的滚动行为 当切换到新路由时&#xff0c;想要页面滚到顶部&#xff0c;或者是保持原先的滚动位置&#xff0c;就像重新加载页面那样 注意: 这个功能只在 HTML5 history 模式下可用。在这个模式下我们需要启动一个服务 我们用scrollBehavior 方法来做路由滚…

php基础教程 第三步 学习字符串及相关函数

字符串 上一节中我们学习了 php 变量、常量以及数据类型的一些概念。这一节中进一步学习数据类型中的字符串类型及其相关操作方法。 字符串指一串字符的合集。例如单个字符 a&#xff0c;单个字符 b&#xff0c;单个字符 c…这些 a、b、c 皆是字符&#xff1b;当把这些字符连…

冲刺第五天

今天做了什么&#xff1f; 今天学习了一下jQuery的元素获取&#xff0c;操作&#xff0c;attribute方法。 明天要做什么&#xff1f; 明天我准备调出程序算法进行测试。 遇到的困难&#xff1f; 还不懂jQuery的一些ui操作。 转载于:https://www.cnblogs.com/kt97458/p/5444148.…

ASP.NET CORE MVC使用SCD(独立部署)发布

简介Self-contained deployments (SCD), 生成一个可自己执行的文件以及所有依赖, 比如一个xxx.exe和一大堆dll, 直接运行即可, 不需要操作系统安装.net core 运行时步骤1、首先创建一个ASP.NET CORE MVC项目2、右击项目&#xff0c;点击编辑xxx.csproj&#xff0c;在下编辑<…

Mirantis OpenStack fuel web 安装 使用

2019独角兽企业重金招聘Python工程师标准>>> MirantisOpenStack-4.0.iso的下载地址&#xff1a;http://pan.baidu.com/s/1dDsuzXf。下载之后使用虚拟机或者物理机安装都可以&#xff0c;我使用的是vmware。需要把NAT的自动分配ip功能关闭 1、创建虚拟机 &#xff08…

word2vec需要去标点吗_word2vec学习笔记(应用篇)(金庸武侠)

写在前面本来是想写“实战篇”的&#xff0c;感觉实验语料库不大&#xff0c;就算是一个"应用篇"吧。选取了中文语料&#xff0c;主要简单介绍jieba分词的使用&#xff0c;以及Gemsim模块中Word2Vec的使用。word2vec的原理可以参考之前的文章&#xff1a;华夏狼崽&am…

ArcGIS实验教程——实验四:数字化属性数据的采集

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 目录 一、实验内容 二、实验目的 三、实验数据 四、实验过程 【实验描述】 属性数据是GIS空格数据的重要组成部分。属性数据采集的基本操作由于地理实体(如建筑物) 位于地块之内成者与地…

[图] DevOps:提速从研发到交付流程

你的产品要让用户等多久&#xff1f;制定需求、排期开发、部署调试……这些流程都再跑一遍&#xff1f;传统产品发布流程长&#xff0c;多分支、环境不一、人工操作导致容易出错。面对这些传统发布难题&#xff0c;DevOps才是正确的出路。

php基础教程 第四步 学习运算符

在前面的章节中&#xff0c;以及了解了一些运算法&#xff0c;接下来再讲解一些常规运算法。 加运算法&#xff0c;用来使左右两边的值或表达式进行加法计算。例如有一个变量$a&#xff0c;一个变量$b&#xff0c;它们的值都为9&#xff0c;$a$b为99等于10.。输出使用echo&…

JavaScript基础学习(七)—BOM

BOM(Browser Object Model): 浏览器对象模型。提供了独立于内容而与浏览器窗口交互的对象&#xff0c;BOM主要用于管理窗口和窗口之间的通讯。 一、Navigator对象 navigator对象通常用于获取浏览器和操作系统的信息。 navigator对象是window对象的属性&#xff0c;中文是&…

ArcGIS实验教程——实验五:空间数据编辑

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】 利用ArcGIS进行数字化之后,需要对采集的空间数据进行编辑,包括图形编辑和属性编辑。常用的编辑工具有:编辑折点、延续要素、打断线、连接线、自动完成面、剪切面,整形面等等。 一…