在游戏中精灵不仅要有动作,也有我们看到的动画效果,其实动画也是一种特殊的动作,比如一个拿着刀砍人的精灵,就是通过一帧帧动画帧实现的,效果马上你们就会看到的。今天我们就来学习一下使用不同的方法来创建动画。先整体的看一下用到的一些类以及类的作用。整体的意思就是我们需要一帧一帧的图片资源,这些资源就是精灵帧,然后放到容器CCAnimation中,然后通过动作类CCAnimate将CCAnimation动画类封装,然后精灵执行动画CCAnimate。

动画类 动画类方法一用到的图片资源在如下的文件夹下E:\cocos2d-x-2.2\cocos2d-x-2.2\samples\Cpp\TestCpp\Resources\Images,大家也可以在网站上下载

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

        CC_BREAK_IF(! CCLayer::init());

		CCSize winSize = CCDirector::sharedDirector()->getWinSize();

		//创建一个执行animate动作的精灵
		CCSprite * sprite = CCSprite::create("grossini_dance_01.png");
		sprite->setPosition(ccp(winSize.width/2,winSize.height/2));
		this->addChild(sprite);

		//CCAnimation就是一个容器,用来存放精灵帧的
		CCAnimation * animation = CCAnimation::create();

		//方法1,实际使用的时候不建议使用这种方法,效率不高,这里写出来,只是为了说明原理
		for(int i = 1;i<15;i++)
		{
			CCString * string = CCString::createWithFormat("grossini_dance_%02d.png",i);
			//CCSize contentSize = sprite->getContentSize();
			////创建一个显示区域的对象,参数分别为x,y,width,height
			//CCRect rect = CCRect(0,0,contentSize.width,contentSize.height);
			////创建一个精灵帧,第一个参数是文件的名字,第二个参数是显示的区域,这里要显示整个图片的大小
			//CCSpriteFrame * spriteFrame = CCSpriteFrame::create(string->getCString(),rect);
			////将创建的精灵帧添加到容器中
			//animation->addSpriteFrame(spriteFrame);
			//以上注释掉的内容可以使用以下语句代替,省略了创建精灵帧的过程
			animation->addSpriteFrameWithFileName(string->getCString());
		}

		//设置每帧的间隔时间,这个必须设置没有默认值,否则不能播放
		animation->setDelayPerUnit(0.5);
		//设置动画的循环播放次数,-1代表不断循环播放,默认播放一次
		animation->setLoops(-1);

		//CCAnimationCache动画缓存类,用来存放animation,我们可以把动画都保存进去,当我们希望节点播放什么动画的时候通过方法获取
		CCAnimationCache * animationCache = CCAnimationCache::sharedAnimationCache();
		//参数是一个animation和一个键,通过这个名字和animation对应起来
		animationCache->addAnimation(animation,"an");

		CCAnimate * animate = CCAnimate::create(animationCache->animationByName("an"));
		sprite->runAction(animate);

        bRet = true;
    } while (0);

    return bRet;
}

方法二涉及到纹理的概念,纹理不是很好理解,可以看看如下的帖子(http://bbs.csdn.net/topics/390626067),本方法用到的资源在如下的文件夹中(E:\cocos2d-x-2.2\cocos2d-x-2.2\samples\Cpp\TestCpp\Resources\zwoptex)。其中用到的一张图片如下所示。
动画类

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

        CC_BREAK_IF(! CCLayer::init());

		CCSize winSize = CCDirector::sharedDirector()->getWinSize();

		//创建一个执行animate动作的精灵
		CCSprite * sprite = CCSprite::create("grossini_dance_01.png");
		sprite->setPosition(ccp(winSize.width/2,winSize.height/2));
		this->addChild(sprite);

		//CCAnimation就是一个容器,用来存放精灵帧的
		CCAnimation * animation = CCAnimation::create();

		//方法2
		//CCTextureCache是纹理缓存类,以后只要是缓存的类,即以cache结尾都是单例设计模式
		CCTextureCache * textureCache = CCTextureCache::sharedTextureCache();
		//纹理其实就是一张图片(一张放在内存中的图片,方便快速读取,也有人理解为是一张大的图片,把小图片都集成上去,二者都对),addImage将那张大的纹理图片添加到纹理缓存中,返回一个CCTexture2D的纹理对象
		CCTexture2D * texture2D = textureCache->addImage("grossini_dance_atlas.png");
		for(int i = 0;i<3;i++)
		{
			for(int j = 0;j<5;j++)
			{
				if(i == 2 && j == 4)
				{
					break;
				}
				//那张大图中每张小图片的宽是85,高是121
				CCRect rect = CCRect(85*j,121*i,85,121);
				//创建精灵帧的第二种方法,精灵帧的创建方法常用的也就是这俩种,最开始的那种方法是封装了下面的这种方法
				CCSpriteFrame * spriteFrame = CCSpriteFrame::createWithTexture(texture2D,rect);
				//CCSpriteFrame * spriteFrame = CCSpriteFrame::create("grossini_dance_atlas.png",rect);
				animation->addSpriteFrame(spriteFrame);
				//等同于上边的语句,完成的功能相同,省略了创建精灵帧的过程
				//animation->addSpriteFrameWithTexture(texture2D,rect);
			}
		}

		//设置每帧的间隔时间,这个必须设置没有默认值,否则不能播放
		animation->setDelayPerUnit(0.5);
		//设置动画的循环播放次数,-1代表不断循环播放,默认播放一次
		animation->setLoops(-1);

		//CCAnimationCache动画缓存类,用来存放animation,我们可以把动画都保存进去,当我们希望节点播放什么动画的时候通过方法获取
		CCAnimationCache * animationCache = CCAnimationCache::sharedAnimationCache();
		//参数是一个animation和一个键,通过这个名字和animation对应起来
		animationCache->addAnimation(animation,"an");

		CCAnimate * animate = CCAnimate::create(animationCache->animationByName("an"));
		sprite->runAction(animate);

        bRet = true;
    } while (0);

    return bRet;
}

方法三是最常使用的方法,效率也是最高的。

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

        CC_BREAK_IF(! CCLayer::init());

		CCSize winSize = CCDirector::sharedDirector()->getWinSize();

		//创建一个执行animate动作的精灵
		CCSprite * sprite = CCSprite::create("grossini_dance_01.png");
		sprite->setPosition(ccp(winSize.width/2,winSize.height/2));
		this->addChild(sprite);

		//CCAnimation就是一个容器,用来存放精灵帧的
		CCAnimation * animation = CCAnimation::create();

		//方法3 是经常使用的方法,效率比较高
		//CCSpriteFrameCache是精灵帧缓存
		CCSpriteFrameCache * frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();
		//这个plist文件可以通过TexturePacker制作
		frameCache->addSpriteFramesWithFile("grossini.plist");
		for(int i = 1;i<15;i++)
		{
			CCString * string = CCString::createWithFormat("grossini_dance_%02d.png",i);
			CCSpriteFrame * spriteFrame = frameCache->spriteFrameByName(string->getCString());
			animation->addSpriteFrame(spriteFrame);
		}

		//设置每帧的间隔时间,这个必须设置没有默认值,否则不能播放
		animation->setDelayPerUnit(0.5);
		//设置动画的循环播放次数,-1代表不断循环播放,默认播放一次
		animation->setLoops(-1);

		//CCAnimationCache动画缓存类,用来存放animation,我们可以把动画都保存进去,当我们希望节点播放什么动画的时候通过方法获取
		CCAnimationCache * animationCache = CCAnimationCache::sharedAnimationCache();
		//参数是一个animation和一个键,通过这个名字和animation对应起来
		animationCache->addAnimation(animation,"an");

		CCAnimate * animate = CCAnimate::create(animationCache->animationByName("an"));
		sprite->runAction(animate);

        bRet = true;
    } while (0);

    return bRet;
}