cocos2d-x初学笔记08:角色动画Animation

        其实这篇所讲的角色的动画Animation在TestCpp项目里面是属于动作Action范围的,咱们现在把它拿出来单独的说一说。

        动画Animation其实就是一张张连贯的图片顺序播放,新建一个项目,命名为”AnimationTest“。咱们先准备一些图片资源,这里咱们还是从TestCpp示例中获得。从D:\cocos2d-2.0-x-2.0.4\samples\TestCpp\Resources\Images(你的目录有可能不一样)找到grossini.png和grossini_dance_01.png到grossini_dance_14共十四张连贯图片复制到我们自己的项目中的Resources文件夹,然后在VS中右击项目选择添加->现有项,添加刚刚复制的十五张图片到我们的项目AnimationTest即可。

      (注意:我使用的cocos2d-x版本是2.0.4,系统是win7)下载地址

        简单起见,我们只对HelloWorld.cpp文件的init()函数进行修改。但在修改之前我们现在HelloWorld.h文件中使用cocos2d命名空间,即在文件中加入”using namespace cocos2d;“这句话,然后修改init()函数,修改后的函数如下

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //
        // super init first
        //

        CC_BREAK_IF(! CCLayer::init());

        //
        // add your codes below...
        //

        // 1. Add a menu item with "X" image, which is clicked to quit the program.

        // Create a "close" menu item with close icon, it's an auto release object.
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
            "CloseNormal.png",
            "CloseSelected.png",
            this,
            menu_selector(HelloWorld::menuCloseCallback));
        CC_BREAK_IF(! pCloseItem);

        // Place the menu item bottom-right conner.
        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

        // Create a menu with the "close" menu item, it's an auto release object.
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero);
        CC_BREAK_IF(! pMenu);

        // Add the menu to HelloWorld layer as a child layer.
        this->addChild(pMenu, 1);

	//取得屏幕大小
	CCSize size=CCDirector::sharedDirector()->getWinSize();
	//创建一个精灵作为角色,并设置位置
	CCSprite* sprite=CCSprite::create("grossini.png");
	sprite->setPosition(ccp(size.width/2,size.height/2));
	//将这个精灵添加进布景
	this->addChild(sprite);

	//创建一个动画
        CCAnimation* animation = CCAnimation::create();
	//这是需要每帧播放的14个图片,用以实现动画的效果
        for( int i=1;i<15;i++)
       {
	//这里是遍历这14个图片,把每个图片按照顺序加入到动画中
        char szName[100] = {0};
	//注释1(文章后面会给出详细解释)
        sprintf(szName, "grossini_dance_%02d.png", i);
        animation->addSpriteFrameWithFileName(szName);
       }
       //设置每一帧播放的时间,共14张图片,共播放2.8秒,那么2.8/14就是每帧的时间
       animation->setDelayPerUnit(2.8f / 14.0f);
      //设置播放完成后是否回到精灵的默认图片
       animation->setRestoreOriginalFrame(true);
      //创建一个动作,是一个动画效果的动作
       CCAnimate* action = CCAnimate::create(animation);
      //执行动画动作
       sprite->runAction(action);

        bRet = true;
    } while (0);

    return bRet;
}

运行程序,我们会看到一个小人在屏幕中央跳舞,跳舞结束后会回到初始化的状态。

                     

注释1:我们来说明一下文章中出现的sprintf()函数的功能和用法。

第一次看到sprintf(),我想大家肯定会联想到常见的JAVA输出函数printf(),首先说一下这两个函数的区别

sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。所以我们可以简单的认为,sprintf()函数是用来制作字符串的。

我们先来说一个最简单的用法,将数字123打印成一个字符串保存到s中,那么实现代码如下:

sprintf(s, "%d", 123);

我们再来分析一下文章中出现的 sprintf(szName, "grossini_dance_%02d.png", i);  看起来复杂了很多,因为多了个”02“,其实它的作用也是一样,将i按照第二个参数的格式打印成字符串保存到szName中。

其中里面的”2“表示i的宽度,”0“表示不足指定宽度的左边用”0“来补齐。比如说 i 为5,那么最终生成的字符串为”grossini_dance_05.png“。其实sprintf()函数还有很多用法,这里就不一一描述了,感兴趣的自行查阅资料。


最后祝愿每一个奋斗在路上的人早日实现梦想!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值