精灵是游戏中非常重要的元素之一。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类及其子类。
Cocos2d-x精灵创建
最新推荐文章于 2025-05-03 09:07:35 发布