cocos2d-x的Sptrite Action SpriteFrame Animation texture使用的简单方法---学习笔记

第一次写这东西,还是一边学习一边写的,主要目的是作为个人的笔记。各位看客,多多包含。
一边看代码摸索,一边找网上的资料总结。

http://blog.csdn.net/qiurisuixiang/article/details/8773787  这个链接对于下面的一些关键对象解释的很给力,对于理解很有帮助,初学游戏编程的可以看看。

spriteframeCache 图片资源的缓存,在程序的内存空间只存在一个.包含Texture2D信息
它是管理CCSpriteFrame的内存池,跟CCTextureCache功能一样,不过跟CCTextureCache不同的是,如果内存池中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。它的内部封装了一个字典:CCDictionary *m_pSpriteFrames,key为帧的名称。CCSpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。

TextureCache
它相当于CCTexture2D的容器,是内存池,用来缓存CCTexture2D对象的,它内部有一个字典CCMutableDictionary m_pTextures,key为图片的名称,值是CCTexture2D。当调用它的addImage函数添加图片时,会先根据图片名称去内存中查找是否已存在,是则直接取出返回

Texture2D          
图片的纹理信息,认为是一张图片的全部信息,可以使用Rect获取整个图片中的部分信息
可以把它看成一个纹理,它是cocos2d-x渲染图形的重要参数,用来贴图,因为cocos2d-x使用opengl es绘制2d图形的,它的尺寸是2的n次方。一般通过以下方式获得:
CCTexture2D* cache = CCTextureCache::sharedTextureCache()->addImage("hero.png");

spriteframe         
使用Texture2D的信息来初始化,Texture2D可以是一个spriteFrame,也可以是多个SpriteFrame组成的。如果Texture2D包含多个SpriteFrame,那么图片资源此时可能是一张由多个图片和成出来的,使用合成图片是为了提高效率。
SpriteFrame表示精灵的某一帧,大多数情况下精灵本身的图片有多帧。它内部封装了Texture2D和Rect,可以从一个大图片取出一部分作为一帧。

sprite   
就是游戏中一个对象,可以理解为在界面上的一个容器用来装图片的,将图片装在这个sprite容器里面用来显示。

加载SpriteFrameCache 方法  :

SpriteFrameCache::getInstance()->addSpriteFramesWithFile(const char *pszPlist);  使用.Plist文件一次将合成的PNG图片中的信息分离,构成一个frame cache词典,每一个frame纹理对应一个名字(在Plist文件中会将每一个对应的图片和名字对应)。这些信息保存在缓存中,在使用的时候,可以通过SpriteFrameCache::getInstance()->getSpriteFrameByName(const char*framename),frame cache中其中一个对应 的frame 。

          如果这些图片是一连串动作的分解图片,存在Plist文件,为了在游戏中呈现出动画效果,需要做一些处理。

          1.首先,将这些图片保存在一个数组中,Array* animFrames = Array::createWithCapacity(int NUM),为了动作好看,顺序肯定是要控制好的。

          2.然后使用这个动作数组创建一个动画对象 Animation *animation = Animation::createWithSpriteFrames(animFrames, 0.2f);  0.2f应该是2个图片刷新之间的间隔,这个函数没有看,个人猜测。

          3.AnimationCache::getInstance()->addAnimation(animation, "dance");  。(add://后来看了下代码,发现这个操作的作用仅仅是给动作建立一个索引,方便信息的管理,对于显示并没有实际的用处;但是由于getInstance()方法是一个静态的方法,所以如果这样保存后,在其他位置使用的时候可以方便很多)
          AnimationCache::getInstance()->addAnimationsWithFile("animations/animations.plist");  animations.plist文件中指定的frame文件必须已经创建了FrameCache。
animations.plist文件里面可以包含多个动画,每一个动画由一组图片构成。
          很明显了addAnimation()方法和addSpriteFramesWithFile(const char *pszPlist)方法一样的目的,都是将图片信息保存到缓存,在需要使用的时候,可以高效的调用;
          不同之处是前者是将一个动画保存起来(虽然animation是由多个SpriteFrame图片构成的,但是实际上可以认为这就是一个已经组织好的动画片段,可以直接调度使用);
          SpriteFrameCache::getInstance()->addSpriteFramesWithFile(const char *pszPlist);是一次将多个图片保存起来,并且构成一个索引(后者对应的一次处理一个图片),创建的是SpriteFrame的集合,由于图片的顺序可能并不是程序员所期望的,在使用的时候需要程序员自己确定使用的是索引中的哪一个SpriteFrame。
         

          4.mAnimation = AnimationCache::getInstance()->animationByName(const char* name)  获取之前添加到Animationcache的索引中的动画,根据需要设置动画结束后的动作mAnimation->setRestoreOriginalFrame(true); 这个是设置还原为初始frame。

          5.创建mAnimate = Animate::create(mAnimation);
          可以直接Sprite::create()->runAction(Action mAction),也可以根据需要使用mAnimate创建如下2个Action的子类对象,
           ActionInterval *seq = RepeatForever::create(animB);
           Sequence *seq = Sequence::create(animB,NULL);
Action子类很多,其他的子类还没看到。应该还有其他的对象可以用。


上面的图片有对应的Plist文件,那么如果没有Plist文件的图片该怎么处理呢?

根据指定路径下的图片创建图片纹理  CCTexture2D CCTextureCache::sharedTextureCache()->addImage(const std::string & filepath)

如果图片的纹理仅仅存在一个元素(不是合成的图片),可以直接使用纹理创建精灵Sprite::createWithTexture(Texture2D * texture),也可以直接根据图片文件创建精灵Sprite::create(const char *filename);

如果图片是合成的包含很多元素,Sprite::create(const char *filename, cosnt Rect& rect)获取图片中一个指定的元素来创建一个精灵;根据文件创建SpriteFrame的方法SpriteFrame::create(const char *filename, cosnt Rect& rect),根据纹理创建SpriteFrame的方法createWithTexture( Texture2D * texture, cosnt Rect& rect)

Rect这个结构体指定了合成图片中一个元素在图片中的位置。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值