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

来源:互联网 发布:网购衣服3d模型知乎 编辑:程序博客网 时间:2024/05/20 21:48

        其实这篇所讲的角色的动画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()函数还有很多用法,这里就不一一描述了,感兴趣的自行查阅资料。


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

原创粉丝点击