Cocos2dx中精灵(CCSprite)、动画创建

  • 1 .精灵的3种创建方法
/* _MySprite自定义的一个类 */
bool _MySprite::init()
{
    //方法1.直接使用图片来创建精灵
    CCSprite* sprite = CCSprite::create("CloseNormal.png");
    addChild(sprite);
    sprite->setPosition(ccp(100, 100));
-------------------------------------------------
    //方法2.通过纹理创建精灵
    CCTexture2D* texture = CCTextureCache::sharedTextureCache()
        ->addImage("CloseNormal.png");
    CCSprite* sprite = CCSprite::createWithTexture(texture);
    addChild(sprite);
    sprite->setPosition(ccp(100, 100));
-------------------------------------------------
    //方法3.通过精灵帧(帧)创建精灵
    CCTexture2D* texture = CCTextureCache::sharedTextureCache()
        ->addImage("CloseNormal.png");
    CCSpriteFrame* frame = CCSpriteFrame::createWithTexture(texture, CCRect(0, 0, 20, 20));

    CCSprite* sprite = CCSprite::createWithSpriteFrame(frame);
    addChild(sprite);
    sprite->setPosition(ccp(100, 100));

    return true;
}
  • 2 .动作(CCMoveBy)和动画( CCAnimate)
bool _MoveByAction::init()
{

    CCLayer::init();

    //(1). moveby

    CCSprite* sprite = CCSprite::create("CloseNormal.png");
    sprite->setPosition(ccp(100, 100));
    addChild(sprite);

#if 0
    /* 创建动作 */
    CCMoveBy* moveby = CCMoveBy::create();
    sprite->runAction(moveby);
#endif

-----------------------------------------------------
    //(2). 创建动画
    CCArray* arr = CCArray::create();
    for (auto i = 0; i < var; ++i)
    {
        /* var变量为当前resource中有多少张资源图片 */
        char fileName[256];
        memset(fileName, 0x00, sizeof(fileName));
        sprintf(fileName, "图片名称%d.png", i);
        CCSpriteFrame* frame = CCSpriteFrame::create(fileName, CCRect(0, 0, 80, 80));
        /* CCRect(0,0,80,80)中的80*80是因为图片资源为80*80 */
        arr->addObject(frame);
    }
    CCAnimation* animation = CCAnimation::createWithSpriteFrames(arr, 0.1f);  
                                                        //0.1f是time
    CCAnimate* animate = CCAnimate::create(animation);

    /* 让动画不停的运行 */
    CCRepeatForever* repeat = CCRepeatForever::create(animate);
    sprite->runAction(repeat);

    return true;
}

上面创建动画中,采用了数组来存放图片资源,假如为植物大战僵尸游戏中的植物(豌豆),共有8张(每秒钟8张:p_2_01~p_2_08);如下所示例:
这里写图片描述

但是在实际的开发中,不会这样存放图片资源(会浪费空间),特别是序列帧的特性中;应为下图所示存放资源(将一系列的图片放在一起):
这里写图片描述

细心的读者会有这样的疑惑,那怎么去从一张图片中读出每一个小的图片资源?(假若上面的豌豆图片的名称是:pea.png,那么会有对应的pea.plist文件,其描述了该图片资源的详细信息)。cocos2dx为我们提供了函数来解决这个问题,这样便使得问题简单化;如下代码:

bool _MoveByAction::init()
{

    CCLayer::init();

    //创建一个精灵
    CCSprite* sprite = CCSprite::create("CloseNormal.png");
    sprite->setPosition(ccp(100, 100));
    addChild(sprite);

    //PictureName.plist

    //加载合成中的帧到内存
    CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
    cache->addSpriteFramesWithFile("pea.plist");

    //找出缓冲中的帧并且放到数组arr中
    CCArray* arr = CCArray::create();
    for (auto i = 0; i < 8; ++i)
    {
        /* var变量为当前resource中有多少张资源图片 */
        char FrameName[256];
        memset(FrameName, 0x00, sizeof(FrameName));
        sprintf(FrameName, "图片名称%d.png", i);

        CCSpriteFrame* frame = cache->spriteFrameByName(FrameName);
        arr->addObject(frame);
    }

    //创建animation
    CCAnimation* animation = CCAnimation::createWithSpriteFrames(arr, 0.1f);
    //0.1f是time

    //通过animation来创建animate
    CCAnimate* animate = CCAnimate::create(animation);

    /* 通过animate创建无限循环的动画动作 */
    CCRepeatForever* repeat = CCRepeatForever::create(animate);

    //让精灵来执行动画
    sprite->runAction(repeat);
    return true;
}

猜你喜欢

转载自blog.csdn.net/lixiaogang_theanswer/article/details/77845939
今日推荐