zoukankan      html  css  js  c++  java
  • Cocos2d-x学习笔记(八)之 精灵类CCSprite

      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官网源码中的测试源码。好了,精灵类以及相关类的介绍就到这里了。

  • 相关阅读:
    利用avalon 实现一个简单的成绩单
    有关less 处理@arguments的一些高级技巧
    迷你MVVM框架 avalonjs 0.9发布
    IE9-10 option BUG
    判定元素正在插入到DOM树——DOMNodeInsertedIntoDocument
    迷你MVVM框架 avalonjs 0.85发布
    机器学习研究与开发平台的选择
    JS生成指定范围内的随机数(支持随机小数)
    DDD领域驱动设计 ---- 系列文章
    序列化效率比拼——谁是最后的赢家avaScriptSerializer方式、DataContract方式、Newtonsoft.Json
  • 原文地址:https://www.cnblogs.com/atong/p/3273253.html
Copyright © 2011-2022 走看看