cocos2dx-3.0(4)------Sprite 精灵

本文详细介绍了Cocos2d-x中精灵对象的创建方法及其相关接口,包括多种create函数的应用场景,并通过实例展示了如何利用Sprite实现复杂的动画效果。

               精灵是游戏中必须用的,所以我们有必要弄明白他提供了什么接口,理解这些接口及灵活运用决定了你对他的理解,下面我们一起来学学。

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()表示一直重复,根据上面生成的动画对象来创建

这样创建一个有着不同行为的动画就成功了!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值