cocos2d-x

Cocos2d-x学习笔记——常见22种特效

1、CCShaky3D::create(int range。bool shakeZ,const ccGridSize& gridSize,float duration)//创建一个3D晃动的特效

參数1:晃动的范围

參数2:是否有Z轴晃动

參数3:网格大小

參数4:特效持续时间

2、CCShakyTiles3D::create(int nRange,bool bShakeZ。const ccGridSize& gridSize。float duration)//创建一个3D瓷砖晃动的特效

參数1:晃动范围

參数2:是否伴有Z轴晃动

參数3:网格大小

參数4:特效持续时间

3、CCWaves::create(int wav,float amp,bool h,bool v。const ccGridSize& gridSize,float durat)//创建一个波动特效

參数1:波动的速率

參数2:振幅

參数3:水平波动

參数4:垂直波动

參数5:网格大小

參数6:特效持续时间

4、CCWaves3D::create(int wav,float amp,const ccGridSize& gridSize。float duration)//创建一个3D波动特效

Cocos2d-x缓存机制

Cocos2d-x引擎提供3个缓存类,都是全局单例模式。

CCTextureCache

首先是最底层也是最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加1,保持不被清除,而Cocos2d-x的渲染机制是可以重复使用同一份纹理在不同场合中进行渲染,从而达到重复使用,降低内存和GPU运算资源的开销的目的。常用以下三个接口:

1 static CCTextureCache* sharedTextureCache(); //返回纹理缓存的全局单例
2 CCTexture2D* addImage(const char* fileimage); //添加一张纹理图片到缓存中
3 void removeUnusedTextures(); //清除不使用的纹理

在这3个接口中,CCTextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理CCTextrue2D的引用,可能是新加载到内存的,也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。

Cocos2d-x内存管理

Cocos2d-x内存管理浅解

1、首先我们知道内存管理分为c++自身管理机制以及Cocos2d-x内存管理机制。在c++中。内存分为堆区、栈区、静态存储区(全局存储区)、常量存储区、自由存储区。

主要先说一下堆区和栈区。

堆区主要由new和malloc分配。new与delete,malloc与free成对出现,保证内存的分配与回收。堆内存分配地址是逐渐增大的,这一点与栈区相反,我们都知道栈是先进后出。所以栈的存储方向是内存地址逐渐减小的。栈中的内存也是系统自己主动回收的,这个我们不需要考虑自己管理内存泄露的问题,而堆区的释放一定要注意使用完后手动释放,不然就会出现内存泄露的问题。在小的程序中我们可能感受不到这个问题的严重性,在成品软件中我们必需要严防这个问题,非常多时候在PC端开发的时候没有感觉到不论什么问题。可是版本号公布后就会发现出现非常多Crash。这个当中非常重要的原因就是由于内存泄露。我们常常说手机内存的大小。当手机装了一大堆软件之后就会变得非常卡,就是这个原因,内存泄露之后正在执行的程序越来越感觉内存不够用,严重的就是不断卡顿然后Crash。所以要养成习惯,注意内存使用与回收的问题。

【Cocos2d-x】开发基础-Node与Node层级架构

本篇博客讲解:
1.Node与Node层级架构
2.Node中重要的操作
3.Node中重要的属性
4.游戏循环与调度

Node与Node层级架构

首先来看一张图

【Cocos2d-x】开发基础-Node与Node层级架构

这个图反应了Node与Node的层级架构
所谓层级架构其实就是树形结构/层次结构,从图上可以看出来,树的根是Scene(场景),然后是层,层里面又包含了精灵,菜单,粒子系统,瓦片地图
所有这些元素,都有一个共同的父类,就是Node

这个树形结构,其实就是一种包含关系
【Cocos2d-x】开发基础-Node与Node层级架构
这2个文件共同定义了一个HelloWorld的层

cocos2d-x 创建精灵的五种方法

方法一:直接创建精灵        方法二:参数 图片名称 矩形区域        方法三: 利用帧缓存中的一帧的名称声称一个对象   方法四:利用另外一帧生成一个精灵对象        方法五:利用纹理

关于Cocos2d-x中数据的存储

当局分数的打印和最高分数的记录

1.首先定义一个Label类型的节点在GameScene.cpp的init方法中,设置初始分数为0

_myScore = 0;
scorelabel = Label::createWithSystemFont("Score: 0", "Arial", 36);
scorelabel->setAnchorPoint(Vec2(1, 0));
scorelabel->setColor(Color3B::BLACK);
scorelabel->setPosition(size.width, size.height - scorelabel->getContentSize().height); 
this->addChild(scorelabel,2);

2.当满足某个加分条件时,改变Label的文本值(没必要放在什么Update方法中,效率太低)

//如果敌方飞机挂了,玩家增加分数,加1分
_myScore += 1;
char buf[100] = { 0 };
sprintf(buf, "Score: %d", _myScore);
scorelabel->setString(buf);

cocos2d-x多线程渲染的一些探讨

可行性:

游戏循环主要包括这几个部分:
1、硬件事件,主要就是指触屏事件,按键事件和鼠标事件;
2、游戏事件,主要指定时器事件和预定义事件,比如schedule;
3、游戏逻辑,对于胖脚本端来说,这个就指的脚本逻辑;
4、渲染数据的生成,在引擎里面就是指node的visit,这里计算生成所有即将发往OpenGL的数据,包括顶点纹理坐标等attribute数据,变换矩阵纹理等uniform数据,混合模式等渲染状态;
5、通过OpenGL接口把所有数据发往OpenGL。

这几个步骤里面,只有第五个步骤需要涉及到OpenGL操作,而前面四个步骤都是为第五个步骤做准备,而第五个步骤不用或者很少需要反馈数据给前面四个步骤。这是一个典型的生产者消费者模式,在很低线程同步开销的情况下课采用多线程处理。

必要性:

处理游戏逻辑(包括前四个步骤)承担了太多cpu运算,而发数据到OpenGL也相当耗时,尤其涉及到多次的渲染状态切换。在多核cpu上面把二者分开可以提高并行性,进而提高游戏帧率。

一些方案:

【Cocos2d-x游戏开发】浅谈游戏中的坐标系

无论是开发2D还是开发3D游戏,首先必须弄清楚坐标系的概念。在Cocos2d-x中,需要了解的有OpenGL坐标系、世界坐标系和节点坐标系。

1.UI坐标系

IOS/Android/Windows SDK中通用的UI坐标系默认起点坐标(x=0,y=0)位于坐上角,x轴从屏幕最左边开始,由左向右逐渐增加;Y轴坐标从屏幕最上方开始,由上至下逐渐增加,如图所示:

【Cocos2d-x游戏开发】浅谈游戏中的坐标系

UI坐标系又被称为纹理坐标系,在Cocos2d-x中,只有从纹理截取部分矩形时才使用这个坐标系,例如Sprite的TextureRect属性。

2.OpenGL坐标系

关于Cocos2d-x中对其他某个类的某个属性的获得

类A要获得类B中的某个属性,可以是节点属性

方法一

1.先在B类中定义一个_edge的节点属性(可以在B类中进行各种对_edge的操作),然后写一个方法

Node* GameController::getEdge(){
  return _edge;
}

2.接着在A类中先实例化一个B类的对象,然后用这个对象调用刚才写在B类中的那个方法,就可以获得B类中的那个属性。

if (gc->getEdge()->getBoundingBox().containsPoint(t->getLocation())) {
   
}

方法二

1.先在B类中定义一个_edge的节点属性(可以在B类中进行各种对_edge的操作)

2.接着在A类中先实例化一个B类的对象,因为这个对象本身是一个指针,所以再用“*”可以变成一个真实的对象,真实的实例,这时候就可以直接用“.属性值”的方法来获得想要的B类中的_edge的节点属性。

if ((*gamecontroller)._hero->getPositionX() < 0) {

}

Cocos2d-x精灵的性能优化——使用纹理图集和精灵帧缓存

使用纹理图集

纹理图集(Texture)也称为精灵表(Sprite Sheet)

使用纹理图集的优点:

1、减少文件读取次数,读取一张图片比读取一推小文件要快

2、减少OpenGL ES绘制调用并且加速渲染
OpenGL ES 1.1仅仅能够使用2的n次幂大小的图片(即宽度或者高度是2、4、8、64…)。
如果采用小图片OpenGL ES1.1会分配给每个图片2的n次幂大小的内存空间,即使这张图片达不到这样的宽度和高度也会分配大于此图片的2的n次幂大小的空间。那么运用这种图片集的方式将会减少内存碎片。
虽然在Cocos2d-x v2.0后使用OpenGL ES2.0,它不会再分配2的几次幂的内存块了,但是减少读取次数和绘制的优势依然存在。

3、减少内存消耗。

4、Cocos2d-x全面支持Zwoptex和TexturePacker,所以创建和使用纹理图集是很容易的

Cocos2d-x精灵的性能优化

同步内容
--电子创新网--
粤ICP备12070055号