跟着石頭哥哥學cocos2d-x(四)--cocos2dx中的動畫以及TexturePacker使用


以前向Andreas Loew申請了一枚TexturePacker註冊碼,很快都下來了,做爲回報我打算仍是寫一篇關於TexturePacker的使用博客吧,有興趣的能夠在這裏申請密鑰,http://www.codeandweb.com,前不久他也來信回訪過問我使用感受怎樣,由於工做的緣由,太忙了,這裏我主要介紹下cocos2dx中的動畫以及TexturePacker使用。 web

作動畫以前,要準備素材,在demo中的你能夠下載:http://pan.baidu.com/share/link?shareid=1419818902&uk=3088193979 數組

打開TexturePacker, 緩存

這個相信你們都看得懂,這裏選擇cocos2d,而後添加文件夾,該工具會自動加載紋理圖片,選擇打包的紋理圖片以及plist輸出路徑: 工具


各項參數設定完畢,發佈,你會在設置的輸出路徑獲得打包好的圖片以及一個plist文件; 動畫

接下來,介紹下動畫的創做: this

動畫創做有不少中方式,這裏我就採用plist方式來建立動畫;注意幾點 1.精靈幀緩衝;2.精靈幀;3.動畫序列容器;ps:再次建議學2dx的話,有精力, 把源碼翻來看看,由於咱們不少是記不住的 可是原理必定要明白。 spa

這裏直接上建立動畫步驟,demo代碼片斷: code

一、加載plist到緩衝幀裏面,這裏經過數組來建立動畫幀序列; orm

2.將精靈幀添加到數組中; 圖片

3.建立精靈;

4.建立動畫序列幀(注意動畫序列容易這裏CCSequence用類型),最後回調runAction(CCAction *action);


#ifndef __ROLE__HH__
#define   __ROLE__HH__
#include "cocos2d.h"
USING_NS_CC;
class role:public CCLayer
{
public:
	role(void);
	~role(void);
	virtual bool init();  
	static cocos2d::CCScene* scene();
	CREATE_FUNC(role);
};
#endif




#include "role.h"


role::role(void)
{
}


role::~role(void)
{
}

bool role::init()
{
	  bool bRet = false;
	do 
	{
		//-new-//
		CCSize mysize=CCDirector::sharedDirector()->getWinSize();
		//把role.plist加入緩存幀
		CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("role/role.plist");
	

		//建立幀數組--數組來保存幀動畫
		CCArray * attackArray=CCArray::create();
		//attackArray->retain();

		CCArray * attackArray2=CCArray::create();
		//attackArray2->retain();


		CCArray * runArray=CCArray::create();
		//runArray->retain();

		CCArray * walkArray=CCArray::create();


		for (int index=1;index!=9;++index)
		{
			//從緩存中獲取精靈幀添加到數組中
			CCLOG(CCString::createWithFormat("%s%d.png","Img_Zhici",index)->getCString());
			attackArray->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->
				spriteFrameByName(CCString::createWithFormat("%s%d.png","Img_Zhici",index)->getCString()));
		}
		//Img_Zhn1.png
		for (int i=1;i!=17;++i)
		{
			//從緩存中獲取精靈幀添加到數組中
			CCLOG(CCString::createWithFormat("%s%d.png","Img_Zhn",i)->getCString());
			attackArray2->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->
				spriteFrameByName(CCString::createWithFormat("%s%d.png","Img_Zhn",i)->getCString()));
		}
		//run 
		for (int i=1;i!=7;++i)
		{
			CCLOG(CCString::createWithFormat("%s%d.png","Img_ZRun",i)->getCString());
			runArray->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->
				spriteFrameByName(CCString::createWithFormat("%s%d.png","Img_ZRun",i)->getCString()));
		}

		 //walk
		   for (int i=1;i!=7;++i){
			   CCString::createWithFormat("%s%d.png","Img_Zwlak",i)->getCString();
			   walkArray->addObject(
				   CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(
				   CCString::createWithFormat("%s%d.png","Img_Zwlak",i)->getCString()));
		   }


		//建立攻擊類型1 精靈
		CCSprite * sp=CCSprite::createWithSpriteFrame((CCSpriteFrame*)attackArray->objectAtIndex(0));
		sp->setPosition(ccp(mysize.width/4,mysize.height/3));
		this->addChild(sp);


		//建立攻擊類型2精靈
		CCSprite * standAttack=CCSprite::createWithSpriteFrame((CCSpriteFrame*)attackArray2->objectAtIndex(0));	
		CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
		standAttack->setPosition(ccp(visibleSize.width/3,visibleSize.height/3));
		this->addChild(standAttack);

		//經過數組中的第一個精靈幀 建立奔跑精靈  
		CCSprite *runsprite=CCSprite::createWithSpriteFrame((CCSpriteFrame*)runArray->objectAtIndex(0));
		runsprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/3));
		this->addChild(runsprite);


		CCSprite *walkSprite=CCSprite::createWithSpriteFrame((CCSpriteFrame*)walkArray->objectAtIndex(0));
		walkSprite->setPosition(ccp(visibleSize.width/1.5,visibleSize.height/3));
		this->addChild(walkSprite);

		//建立動畫
		CCAnimation *animation1=CCAnimation::createWithSpriteFrames(attackArray,0.1f);
		CCAnimate *attack1=CCAnimate::create(animation1);


	    CCAnimation * standAnimation=CCAnimation::createWithSpriteFrames(attackArray2,0.1f);
	  	CCAnimate *standAnimate=CCAnimate::create(standAnimation);

		CCAnimation * runAnimation=CCAnimation::createWithSpriteFrames(runArray,0.1f);
		CCAnimate *runAnimate=CCAnimate::create(runAnimation);

		CCAnimation * walkAnimation=CCAnimation::createWithSpriteFrames(walkArray,0.15f);
		CCAnimate *walkAnimate=CCAnimate::create(walkAnimation);




		//CCSequence動做序列容器 CCSpawn
		CCSequence* pse1=CCSequence::create(attack1,NULL);
		CCSequence* pse2=CCSequence::create(standAnimate,NULL);
		CCSequence* pse3=CCSequence::create(runAnimate,NULL);
		CCSequence* pse4=CCSequence::create(walkAnimate,NULL);
	
		//執行動做 forerver
		sp->runAction(CCRepeatForever::create(pse1));
		standAttack->runAction(CCRepeatForever::create(pse2));
		runsprite->runAction(CCRepeatForever::create(pse3));
		walkSprite->runAction(CCRepeatForever::create(pse4));

		CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("role/role.plist");
		bRet=true;
	} while (0);

	return bRet;
}

cocos2d::CCScene* role::scene()
{
	CCScene * scene = NULL;
	do 
	{
		scene = CCScene::create();
		CC_BREAK_IF(! scene);
		role *layer = role::create();
		CC_BREAK_IF(! layer);
		scene->addChild(layer);
	} while (0);
	return scene;
}



運行效果以下:


源碼在這裏以及打包好的資源:http://pan.baidu.com/share/link?shareid=1535353761&uk=3088193979

ps:關於TexturePacker做者,很厲害 也是很熱情的 ,key在你申請以後會很快發放下來呵呵,感謝他提供這樣優秀的工具!

相關文章
相關標籤/搜索