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

前端之家收集整理的这篇文章主要介绍了Cocos2d-x学习笔记(九)纹理CCTexture2D和精灵CCSprite前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


原创文章,转载请注明出处: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

  1. CCSprite*sprite=CCSprite::create(@H_502_58@"HelloWorld.png");
利用create方法完成了对图片纹理的加载,我们来看看创建过程的源码
    CCSprite*CCSprite::create(constchar*pszFileName,constCCRect&rect)
  1. {
  2. CCSprite*pobSprite=newCCSprite();//创建一个CCSprite对象
  3. if(pobSprite&&pobSprite->initWithFile(pszFileName,rect))//如果成功创建,且初始化成功
  4. {
  5. pobSprite->autorelease();//添加自动释放管理CCPoolManager中
  6. returnpobSprite;
  7. }
  8. CC_SAFE_DELETE(pobSprite);//创建失败,安全删除
  9. returnNULL;
  10. }
  11. 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,@H_502_58@"");//文件名不能为空
  12. CCTexture2D*pTexture=CCTextureCache::sharedTextureCache()->addImage(pszFilename);//将图片添加至纹理缓存中,并获取对应的CCTexture对象
  13. if(pTexture)//如果对象不为空,返回initWithTexture
  14. returninitWithTexture(pTexture,rect);
  15. returnfalse;
  16. 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);//点矩形转像素矩形
  17. returninitWithTexture(pobTexture,rectInPixels,153); background-color:inherit; font-weight:bold">false,CCPointZero,rectInPixels.size);
  18. constCCRect&rect,boolrotated,153); background-color:inherit; font-weight:bold">constCCPoint&offset,153); background-color:inherit; font-weight:bold">constCCSize&originalSize)
  19. m_pobTexture=pobTexture;
  20. if(pobTexture)
  21. pobTexture->retain();
  22. m_obRectInPixels=rect;
  23. m_obRect=CC_RECT_PIXELS_TO_POINTS(rect);
  24. m_obOffsetInPixels=offset;
  25. m_obOffset=CC_POINT_PIXELS_TO_POINTS(m_obOffsetInPixels);
  26. m_obOriginalSizeInPixels=originalSize;
  27. m_obOriginalSize=CC_SIZE_PIXELS_TO_POINTS(m_obOriginalSizeInPixels);
  28. m_bRotated=rotated;
  29. true;
  30. }

根据CCTexture2D纹理对象创建CCSprite

有时候,为了让图片资源更小,会根据一张图片来创建不同的CCSprite,这样需要首先通过CCTextureCache加载图片图片纹理的缓存,然后从缓存获取这张图片的CCTexture2D对象,根据这个对象来创建CCSprite,代码如下:
  1. CCTexture2D*texture=CCTextureCache()::sharedTextureCache()->addImage(@H_502_58@"Player.png");
  2. 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)
  1. {
  2. newCCSprite();
  3. if(pobSprite&&pobSprite->initWithTexture(pTexture,rect))
  4. {
  5. pobSprite->autorelease();
  6. returnpobSprite;
  7. }
  8. CC_SAFE_DELETE(pobSprite);
  9. returnNULL;
  10. }
createWithTexture和create方法几乎类似。

使用CCSpriteFrame创建CCSprite

CCSpriteFrame是用来定义动画层的每一帧,定义好以后以CCAction的形式作用到一个CCSprite上来呈现动画效果,一般情况下会用这个动画的第一帧来创建CCSprite:
    CCSpriteFramespriteFrame01=CCSpriteFrame::createWithTexture(texture,CCRectMake(132*0,132*0,132,132));
  1. CCSprite*sprite=CCSprite::createWithSpriteFrame(spriteFrame01);
而CCSpriteFrame的创建除了直接通过CCTexture2D对象之外,还可以通过读取纹理工具(Cocos Studio)导出的plist文件来创建。
    CCSpriteFrameCache*cache=CCSpriteFrameCache::sharedSpriteFrameCache();
  1. cache->addSpriteFramesWithFile(@H_502_58@"grossini.plist");
  2. CCArray*aniFrames=CCArray::createWithCapacity(14);
  3. charstr[100]={0};
  4. for(intk=0;k<14;;++)
  5. sprintf(str,@H_502_58@"grossini_dance_%02d.png",(k+1));
  6. CCSpriteFrame*frame=cache->spriteFrameByName(str);
  7. animFrames->addObject(frame);
  8. }
通过grossini.plist将图片剪裁程多帧,在使用的时候通过spriteFrameByName方法从CCSpriteFrameCache获取每一帧,通过工具软件生成plist,通过上述方法解析plist,能大大加快程序开发的效率。

使用CCAnimate和CCAnimation创建动画
    //序列帧加载方法1-逐图加载
  1. CCAnimation*animation=CCAnimation::create();
  2. charstr[100]={0};
  3. inti=1;i<=14;i++){
  4. animation->addSpriteFrameWithFileName(str);
  5. }
  6. animation->setDelayPerUnit(0.2);
  7. animation->setRestoreOriginalFrame(false);
  8. sprite->runAction(CCAnimate::create(animate));
  9. //序列帧加载方法2-切图法
  10. CCArray*animFrames=CCArray::createWithCapacity(14);
  11. CCTexture2D*texture=CCTextureCache::sharedTextureCache()->addImage(@H_502_58@"grossini_dance_atlas_nomipmap.png");
  12. inti=0;i<14;i++){
  13. CCSpriteFrame*spriteFrame=CCSpriteFrame::createWithTexture(texture,CCRectMake(40*i%5,57*i/5,40,57));
  14. animFrames->addObject(spriteFrame);
  15. CCAnimation*animation=CCAnimation::createWithSpriteFrames(animFrames,0.2f);
  16. sprite->runAction(CCAnimate::create(animation));

用CCSpriteBatchNode进行文理贴图的优化

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

    //优化前
  1. inti=0;i<100;i++)
  2. CCSprite*sp=CCSprite::create(@H_502_58@"Icon.png");
  3. intx=arc4random()%480;
  4. inty=arc4random()%320;
  5. sp->setPosition(CCPointMake(x,y));
  6. this->addChild(sp);
  7. //优化后
  8. CCSpriteBatchNode*batchNode=CCSpriteBatchNode::create(@H_502_58@"Icon.png",10);
  9. batchNode->setPosition(CCPointZero);
  10. this->addChild(batchNode);
  11. inti=0;i<100;i++)
  12. CCSprite*sp=CCSprite::create(@H_502_58@"Icon.png");
  13. intx=arc4random()%480;
  14. inty=arc4random()%320;
  15. sp->setPosition(CCPointMake(x,y));
  16. batchNode->addChild(sp);
  17. }


效果(优化前):



效果(优化后):



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

原文链接:https://www.f2er.com/cocos2dx/342687.html

猜你在找的Cocos2d-x相关文章