Cocos2d-x精灵创建

精灵是游戏中非常重要的元素之一。Cocos2d-x通过CCSprit类创建精灵。CCSprite是一副2D图像,CCSprit可以通过图像或者图像中的一个矩形子区域创建。

简单来说,精灵就是一张2D图片,我们在游戏场景中看到的大部分都是精灵对象。通过调用特定的程序接口,我们可以让精灵实现跳跃、旋转、移动、缩放等一系列动作。CCSprit的继承结构如下:

Cocos2d-x中常用的创建精灵的方式有以下两种:

1.通过贴图创建精灵

所谓的贴图,通俗来讲就是图片。可以用一整张图片或图片的一部分来创建精灵对象。

// 通过一整张图片来创建精灵
CCSprite* sprite = CCSprite::create("HelloWorld.png");
// 设置精灵的位置
sprite->setPosition(CCPointZero);
// 将精灵添加到父节点中
this->addChild(sprite);

 

// 通过截取图片的一块矩形区域来创建精灵
CCSprite* sprite = CCSprite::create("Images/grossini_dance_atlas.png", CCRectMake(85*1, 121*1, 85, 121));
sprite->setPosition( ccp( s.width/2 - 100, s.height/2 ) );
this->addChild(sprite, 0, -1);

 

通过这种方式创建的精灵,每创建一次,都要进行一次渲染。可以看到下图中创建5个精灵后的渲染次数为10次(该场景中还有另外的5个精灵)。

 

 如果我们需要用同一张贴图创建多个精灵时,这就需要计算机进行多次渲染工作,这样势必会增加计算机开销,降低渲染效率。

如果我们将所有需要渲染的同一张贴图只进行一次准备,一次渲染,一次清理就可以解决这个问题了。这就产生了下面一种创建精灵的方式。

2.通过CCSpriteBatchNode创建精灵

 当需要用同一张贴图创建多个精灵时,推荐使用下面这种方式,使用CCSpriteBatchNode类来批处理这些精灵,用它作为父节点来创建子精灵,并且用它来管理精灵类,这样就可以提高程序效率。

 

// 第一个参数为图片的路径,第二个参数为预计创建精灵的个数
CCSpriteBatchNode* BatchNode = CCSpriteBatchNode::create("Images/grossini_dance_atlas.png", 50);
// 三个参数分别为子节点对象,子节点的Z轴坐标, tag值
this->addChild(BatchNode, 0, kTagSpriteBatchNode);

CCSprite* sprite = CCSprite::createWithTexture(BatchNode->getTexture(), CCRectMake(x,y,85,121));
BatchNode->addChild(sprite);


 需要说明的是,加入CCspriteBatchNode中的精灵越多,提高效率的效果越明显。

如下图所示,我们同样在场景中创建了5个相同的精灵,而渲染次数只有6次。除去其他已存在的5个精灵,这说明这5个相同的精灵只进行了一次渲染。

 

如果它的父节点或者任意继承树上的节点是CCspriteBatchNode则具有下述特性/限制 

▪ 父节点是CCSpriteBatchNode时具有的特性: ⁃ 更快的渲染速度,特别时CCSpriteBatchNode有很多子节点的情况下 

▪ 限制 ⁃ 不支持照相功能(例如:CCOrbitCamera动作不能执行)

          ⁃ 不支持基于网格的动作(例如:CCLens,CCRipple,CCTwirl)

          ⁃ Alias / Antialias属性属于CCSpriteBatchNode,所以你不能单独设置aliase属性

          ⁃ 渲染(blending)函数属性属于CCSpriteBatchNode,所以你不能单独设置渲染函数属性 

          ⁃ 不支持视差滚动,但是可以通过“代理”精灵模拟

          ⁃ 所有属于同一个CCSpriteBatchNode对象的精灵都具有相同的深度值。

          ⁃ 当CCSpriteBatchNode对象设置锯齿/抗锯齿效果时,所有子精灵也同时设置了锯齿/抗锯齿效果,不可以单独设置。

 此外,所有属于同一个CCSpriteBatchNode对象控制的一组精灵必须使用同一张贴图,但是这并不是一个限制,如果想使用不同的图片,可以把它们放到同一张贴图集中。

我们可以把CCSpriteBatchNode类理解为CCLayer类,只不过CCSpriteBatchNode类只接受CCSprite类及其子类。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值