地球人己阻止不了程序猿们学习cocos2d-x了-学习笔记01

地球人己阻止不了程序猿们学习cocos2d-x了是一个很不错的系列教程(其实我还没看完= =),但是我基础不好,作者基础太雄厚,他很多觉得简单的东西都没有解释,所以我看了又忘,忘了就...又看。

于是我还是决定要记录下来,方便忘记的时候查看。

地球人己阻止不了程序猿们学习cocos2d-x (第一篇)
——木头学习笔记

1.     关于单例类

Cocos2d-x(以后简称cs-x)有不少单例类,比如获取导演类:

CCSize size = CCDirector::sharedDirector()->getWinSize();


上面的语句是获取屏幕大小的对象,因为屏幕是受导演控制的,所以通过导演来获取屏幕大小。而获取导演的方式是sharedDirector,在cs-x中,通常都是通过shared***方法来获取某个类的单例。

2.     创建最简单的精灵
cs-x中要创建一个精灵,很简单(别人帮你封装好了,你当然简单,噗~)
CCSprite* pSprite = CCSprite::spriteWithFile("Background.png");

顺便一提, spriteWithFile是静态方法。
spriteWithFile,顾名思义,就是直接通过一张图片来创建一个精灵。
噗,再顺便一提,这个精灵不会动(只有一张图片,于是当然不会动= =)

3.     使用TexturePacker组合图片,节省空间和内存
TexturePacker可以为cs-x生成两个文件:*.plist和*.png,cs-x已经写了专门的类去处理了。
看看下面的代码:

CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();

cache->addSpriteFramesWithFile("images.plist", "images.png");


看看,shared*函数又出现了,证明了 CCSpriteFrameCache是一个单例类,就我现在所知,它是 CCSpriteFrame缓存池,至于 CCSpriteFrame是什么,我现在还不太清楚。
然后用 addSpriteFramesWithFile方法把images.png图片里的所有小图片生成对应的
CCSpriteFrame对象,存放到缓存池里。

4.     CCSpriteFrameCache缓存池里取得CCSpriteFrame创建精灵对象

CCSprite* pSprite = CCSprite::spriteWithSpriteFrameName("Background.png");


之前的 spriteWithFile改成了 spriteWithSpriteFrameName,顾名思义,这次是通过CCSpriteFrame对象来创建一个CCSprite精灵对象。
通过小图片的名称在CCSpriteFrameCache缓存池里取得CCSpriteFrame对象,再把这个CCSpriteFrame对象赋给CCSprite。

5.     CCSpriteBatchNode,减少glDrawArray的次数(批次渲染)
文中说,“ 我们已经逹到了节省内存减少纹理切换 , 最後一个我们想做的优化是减少 glDrawArray 的次数 , 而我们所运用的技巧 , 就是批次渲染 (Batch Rendering) , cocos2d 提供了 CCSpriteBatchNode 来方便大家做有关的处理 , CCSpriteBatchNode 里的 CCSprite 都是要用同一个纹理的 , 所以我们在建立一个 CCSpriteBatchNode 是要给它一个纹理 , 再把它加到 Layer ”。

批次渲染是什么东西?好像是3D里面的知识,百度了一会,我现在还无法理解。

使用批次渲染很简单,先利用组合的图片去生成一个CCTexture2D对象,再利用这个
Texture2D对象生成CCSpriteBatchNode对象:

CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("images.png");

CCSpriteBatchNode *spriteBatch = CCSpriteBatchNode::batchNodeWithTexture(texture);

addChild(spriteBatch);


然后还是用spriteWithSpriteFrameName方法生成CCSprite对象,但是,要注意,
CCSpriteBatchNode对象已经添加到场景中了,所以对使用同一个纹理(我也不知道什么
是使用同一个纹理,总之,在同一张大图里的小图片就是同一个纹理了)的精灵对象,直接添加到CCSpriteBatchNode对象中,而不是添加到场景中。
更完整的流程:

CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("images.png");

CCSpriteBatchNode *spriteBatch = CCSpriteBatchNode::batchNodeWithTexture(texture);

addChild(spriteBatch);

CCSprite* pSprite = CCSprite::spriteWithSpriteFrameName("Background.png");

spriteBatch->addChild(pSprite, 0);



OK,第一篇的主要学习内容就是这样了,真心感谢原文的作者,作者太强了,我的基础不够,所以很多地方看不懂,只好看一点记录一点,哪天忘了,也好回忆起来。

原文详细教程地址:
http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=775&fromuid=5297

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值