写在前面
前面介绍精灵Sprite和贴图Texture2D的时候都有涉及到精灵帧SpriteFrame,这三个的关系可以粗略看成,Texture2D是封装了一张图片的相关信息,SpriteFrame是对Texture2D的再次封装,可用于创建帧动画,而Sprite是对Texture2D和SpriteFrame的再次封装,以实现一个包含图片信息的“角色”,可执行各种动作和交互。这篇文章我们先说一下SpriteFrame,然后再对这三个对象的用法进行总结。
精灵帧SpriteFrame
精灵帧可以直接使用图片或贴图创建,但一般都是从精灵帧 缓冲区中获取,如果缓冲区没有才创建,并加入到缓冲区,以便下次直接从缓冲区取。
//从精灵获取
auto sprite = Sprite::create("girl.png");
//auto frame = sprite->getSpriteFrame();
//用图片文件创建
//auto frame = SpriteFrame::create("girl.png", Rect(0, 0, 150, 200));
//用贴图创建
TextureCache::getInstance()->addImage("girl.png");
auto texture = TextureCache::getInstance()->getTextureForKey("girl.png");
auto frame = SpriteFrame::createWithTexture(texture, Rect(0, 0, 150, 200));
//加入到精灵帧缓冲区
SpriteFrameCache::getInstance()->addSpriteFrame(frame,"girl");
//以文件格式加入到精灵帧缓冲区
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("start.plist");
//从精灵帧缓冲区中获取
auto frame2 = SpriteFrameCache::getInstance()->getSpriteFrameByName("start1.png");
auto sp = Sprite::createWithSpriteFrame(frame);
this->addChild(sp);
sp->setPosition(visibleSize / 2);
sp->setAnchorPoint(Vec2(0.5, 0.5));
Sprite SpriteFrame Texture2D总结
- SpriteFrame有对应的SpriteFrameCache
加入精灵帧的方法有
addSpriteFrame(SpriteFrame*,const std::string&)
addSpriteFrameWithFileContent(const std::string&,Texture2D*)
addSpriteFrameWithFile(const std::string&)
获取精灵帧的方法有
getSpriteFrameByName(const std::string&)
- Texture2D有对应的TextureCache
加入2D贴图的方法有
addImage(Image*,const std::string&)
addImage(const std::string&)
addImageAsync(const std::string&,const std::function<void(Texture2D*)>&)
获取2D贴图的方法有
getTextureForKey(const std::string&)
- Sprite 与 SpriteFrame
Sprite* sp=Sprite::createWithSpriteFrame(SpriteFrame*)
Sprite* sp=Sprite::createWithSpriteFrameName(const std::string&)
SpriteFrame* sf=sp->getSpriteFrame()
- Sprite 与 Texture2D
Sprite* sp=Sprite::createWithTexture(Texture2D*,cosnt Rect&,bool)
Texture2D* texture=sp->getTexture()
- SpriteFrame 与 Texture2D
SpriteFrame* sf=SpriteFrame::createWithTexture(Texture2D*,const Rect&)
Texture2D* texture=sf->getTexture()
该用哪种方式?
对Texture2D来说,只对特定已知的Sprite或SpriteFrame,才会从这个精灵(帧)那里拿贴图,当我们要手动加载贴图时用Texture2D来加载。
对SpriteFrame来说,只对特定已知的Sprite或Texture2D,才会从这个精灵那里拿精灵帧,或者用已知的贴图创建精灵帧。精灵帧一般是用来做帧动画的,所以更多的用法是加载Plist文件到SpriteFrameCache,然后从SpriteFrameCache拿,或者直接用图片文件创建然后加入到SpriteFrameCache。
对Sprite来说,可以直接用图片文件创建,也可以用贴图或者精灵帧创建,如果我们某个图片(精灵帧)创建,否则用图片文件创建。对于经常用到的文件,建议先加载到贴图缓冲区或精灵帧缓冲区,后面需要用到时从缓冲区取。