其实这篇所讲的角色的动画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()函数还有很多用法,这里就不一一描述了,感兴趣的自行查阅资料。
最后祝愿每一个奋斗在路上的人早日实现梦想!