首页 > 分享 > Sprite(精灵)全解

Sprite(精灵)全解

Sprite(精灵)全解

精灵是游戏中十分重要的组成部分,随处可见,如:游戏背景、NPC、人物、道具等。在cocos2d-x引擎中,只要是用图片展示的,基本上需要使用精灵类。

1. 首先来了解一下跟精灵相关的几个类:

(1) Texture2D

可以把它看成一个纹理,它是cocos2d-x渲染图形的重要参数,用来贴图,因为cocos2d-x使用openglES绘制2d图形的,它的尺寸是2的n次方。一般通过以下方式获得: 

Texture2D * texture

= Director::getInstance()->getTextureCache()->addImage("hero.png");

(2) Sprite

这个就是精灵类,是Node的子类,它的内部封装了Texture2D(纹理),可以通过下面几种方式初始化精灵对象。  

static Sprite* create();

static Sprite* create(const std::string& filename);

static Sprite* create(const std::string& filename, const Rect& rect);

static Sprite* createWithTexture(Texture2D *texture);

static Sprite* createWithSpriteFrame(SpriteFrame *pSpriteFrame);

static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);

(3) TextureCache

它相当于Texture2D的容器,是内存池,用来缓存Texture2D对象的。当调用它的addImage函数添加图片时,会先根据图片名称去内存中查找是否已存在,是则直接取出返回。

如果需要一次加载多张图片的时候,可以先把图片加载到TextureCache中,这样使用图片的时候速度就会很快了。

(4) SpriteFrameCache

它是管理SpriteFrame的内存池,跟TextureCache功能一样,不过跟TextureCache不同的是,如果内存池中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。SpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。如下图所示:


创建精灵方法:利用帧缓存中的一帧的名称声称一个对象,适合于plist打包好的文件:

SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/grossini.plist", "animations/grossini.png");

sprite* hero = sprite::createWithSpriteFrameName("grossini_dance_01.png");

只要plist文件跟对应的png图片在同一目录下,且名字相同,则addSpriteFramesWithFile(“animations/ grossini.plist”, “animations / grossini.png”);

可以改成addSpriteFramesWithFile(“animations/grossini.plist”);

创建精灵方法:利用另外一帧生成一个精灵对象,适合于做帧动画使用。

SpriteFrame* frame = SpriteFrame::create("icon.png", Rect(0, 0, 40, 30));

Sprite* sprite = Sprite::createWithSpriteFrame(frame);

  (5) SpriteBatchNode

它是批处理绘制精灵,主要是用来提高精灵的绘制效率的,需要绘制的精灵数量越多,效果越明显。因为cocos2d-x采用opengl es绘制图片的,opengl es绘制每个精灵都会执行:open-draw-close流程。而SpriteBatchNode是把多个精灵放到一个纹理上,绘制的时候直接统一绘制该texture,不需要单独绘制子节点,这样opengles绘制的时候变成了:open-draw()-draw()…-draw()-close(),节省了多次open-close的时间。注意:因为绘制的时候只open-close一次,所以SpriteBatchNode对象的所有子节点都必须和它是用同一个texture(同一张图片),类似下面这样的图片,4个贝壳都在同一纹理上:

 

1.  直接使用Layer进行添加精灵,Layer上有几个精灵,那么底层就会绘制几次精灵;

简单可以理解成底层绘制方式如下:

for(int i= 0;i<100;i++){open-draw-close;}

但是使用集合的话,Layer只需要对精灵集合进行一次渲染,

简单可以理解成底层绘制方式如下:

open-draw(100次绘制)-close

从以上两种方式可以看出两者的区别了,第二种使用精灵集合省去了99次open和close的过程,从而达到优化作用;

2.使用SpriteBathNode虽然能达到优化,但是要注意一点:

初始化精灵集合SpriteBatchNode的时候会加载一张图片资源(或者pvr文件等),那么限制其精灵集合的子精灵都必须使用集合加载的这张图才行,否则会给出警告;

3.使用SpriteBatchNode还要注意一点,因为精灵都存放在集合中,那么这个集合SpriteBatchNode中的节点(精灵)都将在同一个z轴上,同一深度上;

一般使用TexturePacker工具都会将很多精灵图片或者动作帧放在一起打包成“.pvr.z”、”.plist”、“-hd.pvr.z”和”-hd.plist”的四个文件,其中两个-hd的是使用工具生成的打包资源的高清版本(940*480)使用的,这个不再强调了;

那么肯定会有童鞋说,那么如果把这资源文件与SpriteBathNode结合使用岂不是更嗨皮,没错,可以的,加载的时候只需要将如下创建集合即可:

创建精灵方法:SpriteBathNode与SpriteFrameCache结合使用。

SpriteFrameCache::getInstance()->addSpriteFramesWithFile("xx.plist");

SpriteBatchNode aParenet = SpriteBatchNode::create("xx.pvr.z");

this->addChild(aParenet);

Sprite *pFather = Sprite::spriteWithSpriteFrameName("father.gif");

pFather->setPosition(p(s.width / 2, s.height / 2));

aParenet->addChild(pFather);

相关知识

花仙精灵王专题:生日花守护精灵(二)
花仙精灵王专题:生日花守护精灵(一)
日光温室花卉种植全解
菊花的花语和寓意全解
水肥一体化详细全解(滴灌)
还在沙龙“玩花篮”,这里有你想不到的花篮全解
园林常用花卉全解.docx
第七史诗 如何高效获得精灵之花
茶叶水能浇哪些花?全解!
郁金香品种分类全解.ppt

网址: Sprite(精灵)全解 https://m.huajiangbk.com/newsview328553.html

所属分类:花卉
上一篇: 鸡蛋花如何剪枝,修剪方法介绍
下一篇: 苗木损伤枝必须要修剪吗为什么