精灵帧缓存是缓存的一种,缓存有如下几种:
纹理缓存(texturecache)“。使用纹理缓存可以创建纹理对象,在上一节我们已经用到了。
精灵帧缓存(sritefranmecache)。能够从精灵表中创建精灵帧缓存,然后再从精灵帧缓存中获得精灵对象,反复使用精灵对象时候,使用精灵帧缓存可以节省内存消耗。
动画缓存(animationcache)。动画缓存主要用于精灵动画,精灵动画中的每一帧是从动画缓存中获取的。
这一个节我们主要介绍精灵帧缓存(spriteframecache),要使用精灵帧缓存涉及到的类有:spriteframe和spriteframecache。使用spriteframecache创建精灵对象的主要代码如下:
上述代码第①行是通过spriteframecache创建精灵帧缓存对象,它是采用单例设计模式进行设计的,getinstance()函数可以获得spriteframecache单一实例,addspriteframeswithfile函数是将精灵帧添加到缓存中,其中spirtesheet.plist是坐标文件。我们可以多次调用addspriteframeswithfile函数添加更多的精灵帧到缓存中。
第②行代码sprite::createwithspriteframename("mountain1.png")是通过sprite的createwithspriteframename函数创建精灵对象,其中的参数mountain1.png是spirtesheet.plist是坐标文件中定义的精灵帧名(见spirtesheet.plist文件代码中的第②行)。
下面我们会通过一个实例介绍精灵帧缓存使用,这个实例如下图所示,在游戏场景中有背景、山和英雄三个精灵。

在helloworldscene.cpp实现的init函数代码如下:
上述代码第①行是创建一个背景精灵对象,这个背景精灵对象,并不是通过精灵缓存创建的,而是直接通过精灵文件直接创建的,事实上我们完全也可以将这个背景图片放到精灵表中。
第②行代码是获得精灵缓存对象。第③行代码是通过addspriteframeswithfile函数为精灵缓存中添加精灵帧。在前面的介绍中我们使用一条语句spriteframecache::getinstance()->addspriteframeswithfile("spirtesheet.plist")替代第②和第③行两条语句。在这里我们分成两条语句是因为后面我们还有使用framecache变量。
第④行代码是使用sprite 的createwithspriteframename函数创建精灵对象,其中的参数是精灵帧的名字。
代码第⑤~⑥行是使用精灵缓存创建精灵对象的另外一种函数,其中第⑤行代码是使用精灵缓存对象framecache的getspriteframebyname函数创建spriteframe对象,spriteframe对象就是“精灵帧”对象,事实上在精灵缓存中存放的都是这种类型的对象。第⑥行代码是通过精灵帧对象创建。第⑤和⑥行使用精灵缓存方式主要应用于精灵动画时候,相关的知识我们将在精灵动画部分介绍。
精灵缓存不再使用后忘记清空或移除相关精灵帧,否则如果有相同名称的精灵帧时候,就会出现一些奇怪的现象。清空或移除精灵帧的缓存函数如下:
如果为了防止该场景中的精灵缓存对下一个场景产生影响,我们可以在当前场景所在层的onexit函数中调用这些函数,相关代码如下:
onexit()函数是层退出时候回调的函数,与init函数类似都属于层的生命周期中的函数。我们要在h文件中定义,在cpp文件中声明。helloworld.h文件的相关代码如下:
欢迎加入cocos2d-x技术讨论群:257760386、327403678