原创文章,转载请注明出处:http://www.52php.cn/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
- CCSprite*sprite=CCSprite::create("HelloWorld.png");
利用create方法完成了对图片纹理的加载,我们来看看创建过程的源码
CCSprite*CCSprite::create(constchar*pszFileName,constCCRect&rect)
- {
- CCSprite*pobSprite=newCCSprite();
- if(pobSprite&&pobSprite->initWithFile(pszFileName,rect))
- {
- pobSprite->autorelease();
- returnpobSprite;
- }
- CC_SAFE_DELETE(pobSprite);
- returnNULL;
- }
-
- boolCCSprite::initWithFile(char*pszFilename,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCAssert(pszFilename!=NULL,"");
- CCTexture2D*pTexture=CCTextureCache::sharedTextureCache()->addImage(pszFilename);
- if(pTexture)
- returninitWithTexture(pTexture,rect);
- returnfalse;
- boolCCSpriteFrame::initWithTexture(CCTexture2D*pobTexture,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin: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,代码如下:
- 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创建动画
- 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));
-
-
- 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的内存所以内存比较大,对第三个参数是不会有多大的影响的,但如果是真机调试的话效果会很明显,第一种情况会明显的比较卡。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|