原创文章,转载请注明出处: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
[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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)