Cocos2d-x学习笔记(八)之 精灵类CCSprite

时间:2023-02-06 19:21:38

  1、精灵类CCSprite:

  CCSprite类 是一张二维的图片对象,它可以用一张图片或者一张图片的一块矩形部分来定义。CCSprite 和它的子类可以作为精灵批处理类的子项。CCSprite类的继承关系如下:

  CCTextFieldTTF-->CCLabelTTF-->CCSprite-->CCNode、CCTextureProtocol、CCRGBAProtocol。

  主要的成员函数如下

  initWithTexture:通过贴图定义精灵。

  initWithSpriteFrame:通过CCSpriteFrame 定义精灵。

  initWithSpriteFrameName:通过CCSpriteFrame 名称定义精灵。

  initWithFile:通过文件路径定义。

  setTextureRect:设置贴图矩形。

  displayFrame:获得当前精灵帧。

  setDisplayFrame:设置当前显示帧。

  isFrameDisplayed:当前是否显示此显示帧。

  getBatchNode:获得精灵批处理节点。

  setBatchNode:设置精灵批处理节点。

  setDisplayFrameWithAnimationName:通过动画名称和索引设置显示帧。

  getTextureAtlas:获得贴图集。

  setTextureAtlas:设置贴图集。

  setFlipX:设置x 轴的镜像。

  setFlipY:设置y 轴的镜像。

  这里需要说明的是,纹理贴图集是将我们需要的部分图片放在一张大小固定的图片,可以节约内存。因为OpenGL 机制会把单张图处理成相应大小的长宽都是2 的n 次方的图片,所以把图片放在一起可以节约空间。

  2、贴图类CCTexture2D:

  贴图类CCTexture2D 是关于OpenGL 的概念。在OpenGL 中称图片为贴图,在Cocos2D-x 中CCTexture2D 就是图片对象的意思,可以通过它创建精灵等对象。CCTexture2D类的继承关系如下:

  CCTexture2D-->CCObject-->CCCopying.

  主要的成员函数如下:

  initWithString:通过字符串定义CCTexture2D 类。

  initWithImage:通过图片路径定义CCTexture2D 类。

  initWithPVRFile:通过PVR 图片路径定义CCTexture2D 类。

  CCTexture2D 类是精灵类和其相关类的基础。

  3、精灵批处理类CCSpriteBatchNode:

  当你需要显示两个或两个以上相同的精灵时,如果逐个渲染精灵,每一次渲染都会调用OpenGL 的函数,因为当系统在屏幕上渲染一张贴图的时候,图形处理硬件必须首先准备渲染,然后渲染图形,最后完成渲染以后的清理工作。以上是每次渲染固定的开销,这样帧率就会下降15% 左右或者更多。如果将所有需要渲染的同一张贴图只进行一次准备,一次渲染,一次清理就可以解决这个问题了。这时可以使用CCSpriteBatchNode 类来批处理这些精灵, 比如游戏屏幕中的子弹等就可以这样做。用它作为父层来创建子精灵,并且使用它来管理精灵类,这样可以提高程序的效率。CCSpriteBatchNode 类的继承关系如下:

  CCSpriteBatchNode-->CCNode、CCTextureProtocol。

  这里需要说明的是,加入CCSpriteBatchNode 类的精灵类越多,提高效率的效果就越明显。不过也有一些限制,所有属于同一个CCSpriteBatchNode 类的精灵类都有相同的深度值,也就是说,如果需要呈现一个子弹在人物前面、另外一个子弹在人物后面的不同遮挡关系,获得每个子精灵并单独设置和重排序它们,尽管使用的是同一张贴图,但可以把它们理解为不在同一“层”(并不是布景层)。此外,所有属于同一个CCSpriteBatchNode 类控制的精灵类必须使用同一张贴图,但是这并不是一个限制,如果想使用不同的图片,可以把它们放在同一张贴图集当中。另外还有一些限制,就是CCSpriteBatchNode 类设置锯齿/ 抗锯齿效果时,所有子精灵也同时设置了锯齿/ 抗锯齿效果,不可以单独设置。同样不能单独设置的还有混合函数(blendfunc)。可以把CCSpriteBatchNode 类理解为CCLayer 类,只不过CCSpriteBatchNode类只接受CCSprite 类和它的子类。

  主要成员函数:

  initWithTexture:通过二维贴图来初始化CCSpriteBatchNode 精灵批处理类,第二个参数是估计的CCSprite 精灵个数,但是并不会约束你的使用个数。

  initWithFile:通过图片路径( 格式可以是PNG、JPEG、PVR 等) 来初始化CCSpriteBatchNode 精灵批处理类,第二个参数是估计的CCSprite 精灵个数,但是并不会约束你的使用个数。

  increaseAtlasCapacity:增加贴图集容量。

  removeSpriteFromAtlas:将精灵从贴图集中删除。

  init:初始化。

  创建方法的第一个参数可以是贴图对象,也可以是图片路径。这里主要说明两个创建方法的第二个参数。这个参数是子节点的数量。当然,如果使用第一种方法不显示的定义子节点的数量,系统会使用默认值29,在运行时如果超过空间了,会增加33% 的容量。

  4、精灵帧类CCSpriteFrame:

  精灵帧的概念是相对于动画而产生的。一个精灵是固定的节点,它可以拥有许多精灵帧(CCSpriteFrame),在它们之间切换就形成了动画。CCSpriteFrame 类的继承关系如下:

  CCSpriteFrame-->CCObject-->CCCopying。

  CCSpriteFrame 类通过贴图定义,也可以是贴图的一部分,可以通过精灵的setDisplayFrame 函数来设置当前显示的精灵帧。

  主要成员函数:

  initWithTextureFilename:通过图片路径(格式可以是PNG、JPEG、PVR 等),第二个参数是矩形范围,也就是精灵帧的大小。还有一种是可选的,第三个参数设置是否旋转,第四个参数设置起始点的偏移位置和被裁减之前的原始大小。

  initWithTexture:通过贴图定义,第二个参数是矩形范围,也就是精灵帧的大小。还有一种是可选的,第三个参数设置是否旋转,第四个参数设置起始点的偏移位置和被裁减之前的原始大小。

  getOriginalSize:获得被裁减前的原始大小。

  setOriginalSize:设置被裁减前的原始大小。

  5、精灵帧缓存类CCSpriteFrameCache

  精灵帧缓存类CCSpriteFrameCache 用来存储精灵帧,提前缓存起来有助于提高程序的效率。 CCSpriteFrameCache是一个单例模式,不属于某个精灵,是所有精灵共享使用的。CCSpriteFrameCache 类的继承关系如下:

  CCSpriteFrameCache -->CCObject-->CCCopying。

  主要的成员函数:

  addSpriteFramesWithFile:第一个参数是贴图集plist 文件的路径名。可以是默认贴图,也可以通过第二个参数定义贴图使用贴图对象或路径。

  addSpriteFrame:通过CCSpriteFrame 精灵帧定义,第二个参数是自定义的名称。

  removeSpriteFrames:清空精灵帧。

  removeUnusedSpriteFrames:删除不用的精灵帧。

  spriteFrameByName:根据定义的名称找到精灵帧,如果没有对应的,返回空。

  removeSpriteFrameByName:通过名称删除精灵帧。

  

  下面通过实例来进一步了解并掌握CCSprite类及其相关联的类。

  1、实例化CCSprite类

1 //通过image创建CCSprite
2 CCSprite* sprite = CCSprite::create("Images/text.png",
3 CCRectMake(0,0,85,121) );
4 //把CCSprite实例添加到场景中
5 addChild( sprite );
6 //设置CCSprite实例的位置
7 sprite->setPosition( ccp( p.x, p.y) );

  2、CCSpriteBatchNode类的实例

 1 //首先进行初始化
2 CCSp riteBatchNode* BatchNode = CCSpriteBatchNode::create("Images/grossini_
3 dance_atlas.png", 50);
4 //添加到场景中
5 addChild(BatchNode, 0, kTagSpriteBatchNode);
6
7 //使用CCSpriteBatchNode
8 CCSp riteBatchNode* BatchNode = (CCSpriteBatchNode*) getChildByTag(
9 kTagSpriteBatchNode );
10 int idx = CCRANDOM_0_1() * 1400 / 100;
11 int x = (idx%5) * 85;
12 int y = (idx/5) * 121;
13 CCSprite * sprite = CCSprite :: create(BatchNode->getTexture(),
14 CCRectMake(x,y,85,121));
15 BatchNode->addChild(sprite);
16 sprite->setPosition( ccp( p.x, p.y) );

  精灵类(CCSpriteFrame)和精灵批处理类(CCSpriteFrameCache)的实例这里就不一一举例了,如果感兴趣的同学可以去看Cocos2d-x官网源码中的测试源码。好了,精灵类以及相关类的介绍就到这里了。