Cocos2d-x学习笔记(九)纹理CCTexture2D和精灵CCSprite

Cocos2d-x学习笔记(九)纹理CCTexture2D和精灵CCSprite,第1张

概述原创文章,转载请注明出处:http://www.voidcn.com/article/p-numqktke-bcd.html 前言 在Cocos2d-x中对图片得封装是通过CCImage来完成,该类实现了对于不同类型图片得读取、解析、像素信息保存。由于在引擎内部封装,一般情况下不需要修改此类,由于Cocos2d-x使用了Open GL的图形库,因此在图片显示在屏幕的过程中是通过在3D空间的某个平面


原创文章,转载请注明出处:http://www.jb51.cc/article/p-numqktke-bcd.html


前言

在Cocos2d-x中对图片得封装是通过CCImage来完成,该类实现了对于不同类型图片得读取、解析、像素信息保存。由于在引擎内部封装,一般情况下不需要修改此类,由于Cocos2d-x使用了Open GL的图形库,因此在图片显示在屏幕的过程中是通过在3D空间的某个平面通过纹理贴图的方式完成的图片显示,在Cocos2d-x中通过CCTexture2D来实现。

在纹理处理中有如下一些常用类:

CCImage // 调用libpng libjpg来读取图片的像素信息

CCTexture2D // 封装纹理对象

CCTextureCache // 一组纹理对象,通过CCDictionary管理,通过字符key获取

CCRenderTexture // 创建动态纹理

CCSprite // 实现纹理显示

CCSpriteFrame // 用来定义动画层的每一帧,定义好厚以CCAction的形式作用到一个CCSprite上来呈现动画效果

CCSpriteBatchNode //

CCSpriteFrameCache // 一组纹理对象,通过CCDictionary管理,通过字符key获取

CCAnimation // 实现一组Sprite播放的Action


根据图片文件创建CCSprite

[cpp] view plain copy print ? CCSprite*sprite=CCSprite::create("HelloWorld.png"); 利用create方法完成了对图片纹理的加载,我们来看看创建过程的源码 CCSprite*CCSprite::create(constchar*pszfilename,constCCRect&rect) { CCSprite*pobSprite=newCCSprite();@H_502_102@//创建一个CCSprite对象 if(pobSprite&&pobSprite->initWithfile(pszfilename,rect))//如果成功创建,且初始化成功 { pobSprite->autorelease();//添加到自动释放管理CCPoolManager中 returnpobSprite; } CC_SAFE_DELETE(pobSprite);//创建失败,安全删除 returnNulL; } boolCCSprite::initWithfile(char*pszfilename,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; @R_404_5553@:0px!important; padding:0px 3px 0px 10px!important"> CCAssert(pszfilename!=NulL,"");//文件名不能为空 CCTexture2D*pTexture=CCTextureCache::sharedTextureCache()->addImage(pszfilename);//将图片添加至纹理缓存中,并获取对应的CCTexture对象 if(pTexture)//如果对象不为空,返回initWithTexture returninitWithTexture(pTexture,rect); returnfalse; boolCCSpriteFrame::initWithTexture(CCTexture2D*pobTexture,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; @R_404_5553@:0px!important; padding:0px 3px 0px 10px!important"> CCRectrectInPixels=CC_RECT_POINTS_TO_PIXELS(rect);//点矩形转像素矩形 returninitWithTexture(pobTexture,rectInPixels,153); background-color:inherit; Font-weight:bold">false,CCPointZero,rectInPixels.size); constCCRect&rect,boolrotated,153); background-color:inherit; Font-weight:bold">constCCPoint&offset,153); background-color:inherit; Font-weight:bold">constCCSize&originalSize) m_pobTexture=pobTexture; if(pobTexture) pobTexture->retain(); m_obRectInPixels=rect; m_obRect=CC_RECT_PIXELS_TO_POINTS(rect); m_obOffsetInPixels=offset; m_obOffset=CC_POINT_PIXELS_TO_POINTS(m_obOffsetInPixels); m_obOriginalSizeInPixels=originalSize; m_obOriginalSize=CC_SIZE_PIXELS_TO_POINTS(m_obOriginalSizeInPixels); m_brotated=rotated; true; }
根据CCTexture2D纹理对象创建CCSprite 有时候,为了让图片资源更小,会根据一张图片来创建不同的CCSprite,这样需要首先通过CCTextureCache加载图片到图片纹理的缓存,然后从缓存获取这张图片的CCTexture2D对象,根据这个对象来创建CCSprite,代码如下: [cpp] view plain copy print ? CCTexture2D*texture=CCTextureCache()::sharedTextureCache()->addImage("Player.png"); CCSprite*sprite=CCSprite::createWithTexture(texture,CCRectMake(0,85,121)); CCRectMake是指定一个裁剪区域,该方法实现了将纹理对象texture的一部分区域创建一个CCSprite图层。
CCSprite*CCSprite::createWithTexture(CCTexture2D*pTexture,153); background-color:inherit; Font-weight:bold">constCCRect&rect) { newCCSprite(); if(pobSprite&&pobSprite->initWithTexture(pTexture,rect)) { pobSprite->autorelease(); returnpobSprite; } CC_SAFE_DELETE(pobSprite); returnNulL; } createWithTexture和create方法几乎类似。
使用CCSpriteFrame创建CCSprite CCSpriteFrame是用来定义动画层的每一帧,定义好以后以CCAction的形式作用到一个CCSprite上来呈现动画效果,一般情况下会用这个动画的第一帧来创建CCSprite: CCSpriteFramespriteFrame01=CCSpriteFrame::createWithTexture(texture,CCRectMake(132*0,132*0,132,132)); CCSprite*sprite=CCSprite::createWithSpriteFrame(spriteFrame01); 而CCSpriteFrame的创建除了直接通过CCTexture2D对象之外,还可以通过读取纹理工具(Cocos Studio)导出的pList文件来创建。
CCSpriteFrameCache*cache=CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithfile("grossini.pList"); CCArray*aniframes=CCArray::createWithCapacity(14); charstr[100]={0}; for(intk=0;k<14;;++) sprintf(str,"grossini_dance_%02d.png",(k+1)); CCSpriteFrame*frame=cache->spriteFrameByname(str); animFrames->addobject(frame); } 通过grossini.pList将图片剪裁程多帧,在使用的时候通过spriteFrameByname方法从CCSpriteFrameCache获取每一帧,通过工具软件生成pList,通过上述方法解析pList,能大大加快程序开发的效率。

使用CCAnimate和CCAnimation创建动画 //序列帧加载方法1-逐图加载 CCAnimation*animation=CCAnimation::create(); charstr[100]={0}; inti=1;i<=14;i++){ animation->addSpriteFrameWithfilename(str); } animation->setDelayPerUnit(0.2); animation->setRestoreOriginalFrame(false); sprite->runAction(CCAnimate::create(animate)); //序列帧加载方法2-切图法 CCArray*animFrames=CCArray::createWithCapacity(14); CCTexture2D*texture=CCTextureCache::sharedTextureCache()->addImage("grossini_dance_atlas_nomipmap.png"); inti=0;i<14;i++){ CCSpriteFrame*spriteFrame=CCSpriteFrame::createWithTexture(texture,CCRectMake(40*i%5,57*i/5,40,57)); animFrames->addobject(spriteFrame); CCAnimation*animation=CCAnimation::createWithSpriteFrames(animFrames,0.2f); sprite->runAction(CCAnimate::create(animation));
用CCSpriteBatchNode进行文理贴图的优化

在场景中随机生成100个相同的精灵,看看使用CCSpriteBatchNode优化前和优化后两种不同的效果。

//优化前 inti=0;i<100;i++) CCSprite*sp=CCSprite::create("Icon.png"); intx=arc4random()%480; inty=arc4random()%320; sp->setposition(CCPointMake(x,y)); this->addChild(sp); //优化后 CCSpriteBatchNode*batchNode=CCSpriteBatchNode::create("Icon.png",10); batchNode->setposition(CCPointZero); this->addChild(batchNode); inti=0;i<100;i++) CCSprite*sp=CCSprite::create("Icon.png"); intx=arc4random()%480; inty=arc4random()%320; sp->setposition(CCPointMake(x,y)); batchNode->addChild(sp); }


效果(优化前):



效果(优化后):



优化了之后,明显的看的出第一幅图第一个参数是100,也就是说精灵渲染了100次,这是比较消耗资源的。第二幅图,第一个参数只渲染一次。还有就是由于模拟器调用的是PC的内存所以内存比较大,对第三个参数是不会有多大的影响的,但如果是真机调试的话效果会很明显,第一种情况会明显的比较卡。

总结

以上是内存溢出为你收集整理的Cocos2d-x学习笔记(九)纹理CCTexture2D和精灵CCSprite全部内容,希望文章能够帮你解决Cocos2d-x学习笔记(九)纹理CCTexture2D和精灵CCSprite所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存