cocos2d-x

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精灵的性能优化

Cocos2d-x中的Node

节点是cocos2d-x游戏引擎中的重要元素,是其他重要游戏元素的基类,例如,场景Scene,图层Layer,菜单Menu和精灵sprite都是继承节点类Node. Node类包含了一些基本的属性、节点相关、Action动作的执行、以及定时器等相关的操作。 当然Node也有父类,其父类为Ref。

节点的主要特点:

— 他们可以包含其他的节点对象(addChild, getChildByTag, removeChild, etc)
— 他们可以安排定期的回调(schedule, unschedule, etc)
— 他们可以执行一些动作(runAction, stopAction, etc)
— 子类节点通常意味着(单一的/所有的)
— 重写初始化资源并且可以安排回调
— 创建回调来操作进行的时间
— 重写“draw”来渲染节点
— 节点的属性有:位置、缩放、旋转、倾斜、锚点、内容大小、可见性

节点常用的一些操作函数及新的功能特性。

(1)节点的属性:位置、缩放、旋转、倾斜、锚点、内容大小、可见性

//  
/** 
 * 位置Position 
 *     设置节点的坐标(x,y).在OpenGL中的坐标 
 *     增加3D坐标 
 *     增加标准化坐标设置 
 */  

关于Cocos2d-x中两个场景之间参数的传递

两个场景之间,有的时候要进行参数传递,如果想通过实例化出一个场景,从而得到属性和方法是不对的想法

你有两个场景,第一场景是用户登录界面,第二场景则是你登录后的界面,你如何将用户登录的值传到第二个场景呢?

两种方法(有两个场景 HelloWorld, LotteryScene)

一:1)在LotteryScene.h 中加入成员变量,如 Map<std::string, Node*> map2;(我想说的是任何数据类型都可以,所以这里用Map数据类型来更加有说服力)

并在LotteryScene.cpp的init()方法里,map2做初始化;//可以省略这句

2)在HelloWorld转到LotteryScene时,调用一下一下方法,一定要记得把要传递的变量的类型设置为public

     auto scene = Scene::create();
        LotteryScene *layer = LotteryScene::create();
        layer->map2 = map1;
        scene->addChild(layer);//类似firstScene中的scene()方法  

【Cocos2d-x游戏开发】解决Cocos2d-x中文乱码的三种方法

众所周知,Cocos2d-x是一款不错的开源引擎,但是在Cocos2d-x中直接使用中文是无法正确显示的。

解决这个问题常用的有三种方法:

1.通过转换为UTF-8编码来显示。
2.使用iconv库来解决。
3.使用解析xml或者json文件来解决。

这里推荐使用第三种方法来解决,因为比较简单方便,还能支持I18N国际化。下面我们来一一详细了解一下每种解决方案的具体实现:

一、通过转换为UTF-8编码的方式显示出来

建立一个方法用于转换中文到对应的UTF-8编码,具体代码如下:

char *HelloWorld::FontToUTF8(const char* font){
    int len = MultiByteToWideChar(CP_ACP,0,font,-1,NULL,0);
    wchar_t *wstr = new wchar_t[len+1];
    memset(wstr,0,len+1);
    MultiByteToWideChar(CP_ACP,0,font,-1,wstr,len);

关于Cocos2d-x中定时器的使用总结

定义:定时器在大部分游戏中是不可或缺的,即每隔一段时间,就要执行相应的刷新体函数,以更新游戏的画面、时间、进度、敌人的指令等等。

cocos2dx为我们提供了定时器schedule相关的操作。其操作函数的定义在CCNode中,所以基本上大多数的引擎类都可以设置定时器,如CCLayer、CCSprite、CCMenu等。

种类

定时器更新的方式分为三类:

(1)默认定时器 :scheduleUpdate();
(2)自定义定时器:schedule();
(3)一次性定时器:scheduleOnce();

Demo下载

https://github.com/shahdza/Cocos_LearningTest/tree/master/demo_%E5%AE%9A...

scheduleUpdate

默认定时器:scheduleUpdate()。

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