精灵是游戏中必须用的,所以我们有必要弄明白他提供了什么接口,理解这些接口及灵活运用决定了你对他的理解,下面我们一起来学学。
1. 三个create函数
static Sprite* create();
static Sprite* create(const std::string& filename);
static Sprite* create(const std::string& filename, const Rect& rect);
第一个就是简单的创建一个精灵对象指针,如果想设置可以调用setTexture()
第二个是通过图片来创建一个精灵,这是我们常用的。
第三个是显示图片的某此区域,即不显示全部。
他们都是通过cocos2dx管理的,也就是说不需要自己考虑去释放他。
上面的三个函数是3.0常用的、基本的的创建精灵的方法,没有3.0以前那种createWithFormat等这类的函数接口了,下面给出他们的样例
//第一种
auto sprite_1 = Sprite::create();
//第二种
auto sprite_2 = Sprite::create("helloWorld.png");
//第三种
auto sprite_3 = Sprite::create("helloWorld.png", Rect(0,0,30,35));
//他们所有最后都需要添加到layer上,这个我们前一篇文章里说过
this->addChild(sprint_x);
接下来是createWith系列的函数
static Sprite* createWithTexture(Texture2D *texture);
static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false);
static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);
static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);
前两函数使用纹理,适合于频繁使用的图片。
第三个函数利用一帧图片来创建精灵。
第四个利用这帧图片的名字。
//利用帧去生成一个精灵
auto frame = SpriteFrame::create("Icon.png", Rect(0,0,30,35));
auto sprite = Sprite::createWithSpriteFrame(frame);
//利用帧名字去生一个精灵
//适合于plist打包好的文件,这个很常用
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("xxx.plist");
auto sprite = Sprite::createWithSpriteFrame(frame);
//利用纹理
//适合频繁使用的图片
auto spriteTexture = SpriteBatchNode::create("xxx.png");
this->addChild(spriteTexture);
auto sprite = Sprite::createWithTexture(spriteTexture->getTexture());
spriteTexture->addChild(sprite,2);
//加入到layer中
this->addChild(sprite);
还有很接口,一看就知道了,中间省略N个,下面来看看翻转 bool isFlippedX(void) const;
void setFlippedX(bool flippedX);
bool isFlippedY(void) const;
void setFlippedY(bool flippedY);
这四个函数在3.0以前是用的Flip没用过去式,所以废弃了,这四个函数用的也很多,
带X为水平翻转,即像水平方向的镜像图片一样,以图片中心为坐标原点,水平方向两边对换,假设图片内容为"AB",使用他后为"BA"其他都不会变
带Y为水平翻转,即像垂直方向的镜像图片一样,以图片中心为坐标原点,垂直方向两边对换。
下面来看个精灵复杂点的用例,来熟练掌握一下下下下下
void MySpriteAnimationLayer::initLayer()
{
Size s = Director::getInstance()->getWinSize();
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("animations/animations.plist");
//
// Animation using Sprite BatchNode
//
m_pSprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
m_pSprite1->setPosition( Point( s.width/2-80, s.height/2) );
auto spritebatch = SpriteBatchNode::create("animations/grossini_dance.png");
spritebatch->addChild(m_pSprite1);
addChild(spritebatch);
Vector<Sprite *>animFrames(10);
char str[100] = {0};
for(int i = 1; i < 10; i++)
{
sprintf(str, "grossini_dance_%02d.png", i);
SpriteFrame* frame = cache->spriteFrameByName( str );
animFrames->addObject(frame);
}
Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
m_pSprite1->runAction( RepeatForever::create( Animate::create(animation) ) );
}
Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
提前说点,上面一行代码是创建一个动画,0.3s切换一次,也就是切一帧图片
m_pSprite1->runAction( RepeatForever::create( Animate::create(animation) ) );
RepeatForever::create()表示一直重复,根据上面生成的动画对象来创建
这样创建一个有着不同行为的动画就成功了!