4、cocos2dx動畫Animation介紹

qinning199原創,歡迎轉載,轉載請註明:http://www.cocos2dx.net/?p=22緩存

1、幀動畫動畫

你能夠經過一系列圖片文件,像以下這樣,建立一個動畫:spa

	CCAnimation *animation = CCAnimation::create();
	//從本地文件系統中加載圖片文件到CCSpriteFrame中區,而後添加到CCAnimation中
	for (int i = 1; i < 15; i++)
	{
		char szImageFileName[128] = {0};
		sprintf(szImageFileName, "Images/grossini_dance_%02d.png", i);
		animation->addSpriteFrameWithFileName(szImageFileName);  
	}
	animation->setDelayPerUnit(2.8f / 14.0f); // 這個動畫包含14幀,將會持續2.8秒.
	animation->setRestoreOriginalFrame(true); // 14幀播放完以後返回到第一幀
	
	CCAnimate *action = CCAnimate::create(animation);
	sprite->runAction(action);  // 運行精靈對象

  



注意CCAnimation是由許多精靈幀組成,能夠設置間隔時間,持續時間等,它其實是包含着一組數據。CCAnimate是一個動做,它是經過CCAnimation對象建立。
2、精靈表動畫
儘管手工動畫很容易理解,但它不多用在遊戲開發中。相反的,精靈表動畫的方式在2D動畫中常用。
這是一個精靈表。它實際上就是一系列動畫幀圖片,或者是一個能用於一個場景的圖片集。


在OpenGLES1.1階段,精靈表由於如下幾點被普遍應用:
一、減小文件讀寫時間。讀取一張圖片比讀取一堆小文件確定要快。
二、減小內存消耗。OpenGL ES 1.1僅僅可以使用2的幾回方大小的圖片(也就是寬度或者高度是2,4,864,128,256,512,1024,...)。也就是說,OpenGL ES1.1將會分配給每一個圖片2的幾回方大小的內存空間,即便你這張圖片達不到這樣的寬度和高度也會分配大於此圖片的2的n次方大小的空間。那麼運用這種圖片集的方式將會減小內存碎片。
三、減小OpenGL ES繪製調用而且加速渲染。
Cocos2d-x v2.0升級到了OpenGL ES2.0.OpenGL ES2.0不會再分配2的幾回方的內存塊了,可是減小讀取時間和繪製調用的優點依然存在。
那麼生成的動畫效果如何呢?正如咱們所見,精靈表不是動畫的一個必須條件。可是考慮到以上的一些優點,精靈表仍是頗有效率的。在Cocos2dx中,有許多不一樣的方式來建立精靈表。
3、經過.png 和 .plist文件建立精靈表
在cocos2dx 0.x和1.x版本中,CCSpriteSheet就是爲以上的目的設計。在V2.0中CCSpriteBatchNode替代了CCSpriteSheet。
CCSpriteBatchNode對象包含了全部精靈幀的圖片紋理。即便它不會繪製,你也必需要把它添加到場景中,例如:.net

CCSpriteBatchNode* spritebatch = CCSpriteBatchNode::create("animations/grossini.png");

  


下一步,你須要運用CCSpriteFrameCache實例來確保幀名字對應幀邊界。也就是說,圖片在哪一塊矩形區域中。例如:設計

	CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
	cache->addSpriteFramesWithFile("animations/grossini.plist");

  

一旦你的精靈表和幀加載完成,而且精靈表已經被添加到了場景中,你能夠經過createWithSpriteFrameName方法來建立精靈。而且經過addChild要添加到精靈表中:xml

	m_pSprite1 = CCSprite::createWithSpriteFrameName("grossini_dance_01.png");
	spritebatch->addChild(m_pSprite1);
	addChild(spritebatch);

  



createWithSpriteFrameName 方法將會從grossini.plist中找到對應的座標以及矩形區域,以後再裁剪grossini.png的紋理成一個精靈幀。


如今咱們建立一個CCArray對象而且天劍全部的幀動畫進去。在這個動畫的例子中,咱們發現全部的14幀都有相同的大小,因此咱們能夠用一個嵌套的循環遍歷它們,而且當完成添加14幀以後結束掉循環。對象

	CCArray* animFrames = CCArray::createWithCapacity(15);
	char str[100] = {0};
	
	for(int i = 1; i < 15; i++) 
	{
		sprintf(str, "grossini_dance_%02d.png", i);
		CCSpriteFrame* frame = cache->spriteFrameByName( str );
		animFrames->addObject(frame);
	}

  


最後,咱們須要建立一個CCAnimate動做實例來運行CCSprite。下面咱們能夠在CCRepeatForever動做中包裹CCAnimate動做來讓它一直執行下去,像這樣:blog

	CCAnimation* animation = CCAnimation::createWithSpriteFrames(animFrames, 0.3f);
	m_pSprite1->runAction( CCRepeatForever::create( CCAnimate::create(animation) ) );

  

4、文件動畫
CCAnimateCache可以加載一個描述一批節點的xml/plist文件,包括幀名和他們的矩形區域。這個藉口很是容易使用。遊戲

	CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache(); // 緩存在cocos2dx中一直是單例模式
	cache->addAnimationsWithFile("animations/animations-2.plist");
	CCAnimation animation = cache->animationByName("dance_1");
	CCAnimate animate = CCAnimate::create(animation);
	sprite->runAction(animate);
相關文章
相關標籤/搜索