文档章节

跟着石头哥哥学cocos2d-x(四)--cocos2dx中的动画以及TexturePacker使用

石头哥哥
 石头哥哥
发布于 2013/12/17 22:15
字数 977
阅读 3730
收藏 11


之前向Andreas Loew申请了一枚TexturePacker注册码,很快都下来了,作为回报我打算还是写一篇关于TexturePacker的使用博客吧,有兴趣的可以在这里申请密钥,http://www.codeandweb.com,前不久他也来信回访过问我使用感觉怎样,因为工作的原因,太忙了,这里我主要介绍下cocos2dx中的动画以及TexturePacker使用。

做动画之前,要准备素材,在demo中的你可以下载:http://pan.baidu.com/share/link?shareid=1419818902&uk=3088193979

打开TexturePacker,

这个相信大家都看得懂,这里选择cocos2d,然后添加文件夹,该工具会自动加载纹理图片,选择打包的纹理图片以及plist输出路径:


各项参数设定完毕,发布,你会在设置的输出路径得到打包好的图片以及一个plist文件;

接下来,介绍下动画的创作:

动画创作有很多中方式,这里我就采用plist方式来创建动画;注意几点 1.精灵帧缓冲;2.精灵帧;3.动画序列容器;ps:再次建议学2dx的话,有精力, 把源码翻来看看,因为我们很多是记不住的 但是原理一定要明白。

这里直接上创建动画步骤,demo代码片段:

1、加载plist到缓冲帧里面,这里通过数组来创建动画帧序列;

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在你申请之后会很快发放下来呵呵,感谢他提供这样优秀的工具!











© 著作权归作者所有

上一篇: centos安装 7zip
下一篇: sql路由汇总
石头哥哥
粉丝 302
博文 203
码字总数 120417
作品 2
广州
程序员
私信 提问
加载中

评论(4)

石头哥哥
石头哥哥
cocos3.0版本以后 变化较大 ,CCLayer这样的命名都去掉了 Layer 这个我喜欢, 另一方面加载动画序列帧的方式 使用了vector来存储帧,这个提示很明显了哈,这里请用vector来存储;或者你使用2.x版本 和之前的兼容
Amamatthew
Amamatthew
1>d:\myproject\mygame\classes\role.cpp(90): error C2664: “cocos2d::Animation *cocos2d::Animation::createWithSpriteFrames(const cocos2d::Vector<cocos2d::SpriteFrame *> &,float,unsigned int)”: 无法将参数 1 从“cocos2d::CCArray *”转换为“const cocos2d::Vector<cocos2d::SpriteFrame *> &”
Amamatthew
Amamatthew
根据文章的说明我们下载安装了新的Cocos2dx3.1,创建了一个新的空项目,在新项目的Class文件夹下面增加了role.h和role.cpp两个文件,然后将它们添加到了项目的文件当中,最后修改AppDelegate.cpp文件当中的一句,// auto scene = HelloWorld::createScene();(注释这一句)增加这一句  auto scene = role::scene();然后运行,这个步骤对吗。

我们运行的时候遇到错误:
>d:\myproject\mygame\classes\role.h(6): warning C4996: 'cocos2d::CCLayer': 被声明为已否决

请教一下
jdk2010
jdk2010
顶一下石头,看你没人气
Cocos2d-x 2.0 之 Actions “三板斧” 之一

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 [暂满]加群写:Cocos2d-x 红孩儿Cocos2d-X学习园地Q...

长平狐
2012/11/19
662
0
cocos2d-x js模版修改

创建cocos2d-x项目,导入引擎模版,避免每次都拷贝引擎到项目中,修改路径: D:commonscocos2d-xcocos2d-2.1rc0-x-2.1.3templatemsvcCCAppWiz.win32Scripts1033下的js文件如下: // Additio...

石头哥哥
2013/08/04
0
0
Cocos2d-x 2.0 之 Actions “三板斧” 之一

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 [暂满]加群写:Cocos2d-x 红孩儿Cocos2d-X学习园地Q...

长平狐
2013/03/19
32
0
Quick-Cocos2d-x 3.3 使用WebView

1、编写ini文件。进入frameworks/cocos2d-x/tools/tolua文件夹,可以根据cocos2dxexperimentalvideo.ini编写生产cocos2dxexperimentalwebview.ini,也可以在github(https://github.com/coco......

小房小田
2015/06/11
0
0
quick-cocos2d-x图片资源加密(续)

前篇: quick-cocos2d-x图片资源加密 让quick-cocos2d-x支持加密的plist文件 通过前篇的修改,我们已经能够在Windows平台的player,以及Android上使用加密的常见格式(png、jpg等)的图片资源了...

SunLightJuly
2014/01/03
0
4

没有更多内容

加载失败,请刷新页面

加载更多

硬件配置

https://akkadia.org/drepper/futex.pdf sudo lshw -businfo[sudo] lambda 的密码: Bus info Device Class Description======================================......

MtrS
今天
3
0
springmvc的return “success”源码解读

qqqq

architect刘源源
今天
6
0
Java程序员五面阿里分享 逆袭成功 太不容易了!

前言 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试。在这里分享一下自己的面试经验和学习心得。希望能够帮助更多的小伙伴。 我本科毕业于中南大学信管专业,真正开始学习Jav...

别打我会飞
昨天
4
0
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
昨天
2
0
手把手教你使用issue作为博客评论系统

自从上周在阮一峰的 每周分享第 60 期 看到了可以将 GitHub 的 issue 当作评论系统,插入第三方网页的 JS 库——utterances。我就对此“魂牵梦绕”。个人博客使用的是VuePress。 TLDR (不多废...

jump--jump
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部