本文实践自 Ray Wenderlich、Tony Dahbura 的文章《 How to Use Animations and Sprite Sheets in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建一个简单的熊行走动画,如何使用精灵表单,如何改变熊行走的方向等等。
步骤如下:

1.新建Cocos2d-win32工程,工程名为"
AnimBear";

2.下载本游戏所需的资源;







这些图像的尺寸是最大分辨率所需的尺寸,将以这些图像来创建不同分辨率所需的尺寸。

3.下载
Texture Packer工具,当前为3.1.2版本。拖动资源图片文件到Texture Packer的右边窗口,将会自动加载文件。左边窗口中的
Geometry面板,调整
Max size为4096x4096,因为默认尺寸不够满足大小。
Layout面板,设置
Trim mode为None,不需要移除透明像素。完成之后,如下图所示:







在”
Resources“目录下新建文件夹”
HDR“。确定
Output面板中
Data Format选中
cocos2d,
Data filename定位到”
...\AnimBear\Resources\HDR“路径,文件名为
AnimBear.plist。保存之后,
Texture file将会自动填充文件名。然后,点击
AutoSD设置按钮,下拉选择
Presets项为”
cocos2d-x HDR/HD/SD“,点击”
Apply“按钮,这使得在发布时能够自动创建和保存多种规则的精灵表单,如下图所示:







最后,点击工具栏按钮”
Publish“,将会自动生成精灵表单和纹理文件,如下图所示:







可以用
plist Editor Pro打开
AnimBear.plist文件,可以看到它由两部分组成——帧和元数据。在帧部分,每一个图像都有一个属性,用来描述位于精灵表单中的包围框。如下图所示:







3.一个简单的动画。打开
HelloWorldScene.h文件,添加如下代码: 

1

2

3

4

5

6

 
    CC_SYNTHESIZE_RETAIN(cocos2d::CCSprite*, _bear, Bear);

    CC_SYNTHESIZE_RETAIN(cocos2d::CCAction*, _walkAction, WalkAction);

    CC_SYNTHESIZE_RETAIN(cocos2d::CCAction*, _moveAction, MoveAction);

private:

    
bool _bearMoving;

打开
HelloWorldScene.cpp文件,在构造函数里面,添加如下代码: 

1

2

3

4

5

6

7

 
HelloWorld::HelloWorld()

{

    _bear = 
NULL;

    _walkAction = 
NULL;

    _moveAction = 
NULL;

    _bearMoving = 
false;

}

修改
init函数,为如下代码: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

 
bool HelloWorld::init()

{

    
bool bRet = 
false;

    
do 

    {

        CC_BREAK_IF(!CCLayer::init());

        

        
//1) Cache the sprite frames and texture
        CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(
"AnimBear.plist");

//2) Create a sprite batch node
        CCSpriteBatchNode *spriteSheet = CCSpriteBatchNode::create(
"AnimBear.png");

        
this->addChild(spriteSheet);

//3) Gather the list of frames
        CCArray *walkAnimFrames = CCArray::create();

        
for (
int i = 
; i <= 
; ++i)

        {

            walkAnimFrames->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(

                CCString::createWithFormat(
"bear%d.png", i)->getCString()));

        }

        

        
//4) Create the animation object
        CCAnimation *walkAnim = CCAnimation::createWithSpriteFrames(walkAnimFrames, 
.1f);

//5) Create the sprite and run the animation action
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();

        
this->setBear(CCSprite::createWithSpriteFrameName(
"bear1.png"));

        
this->getBear()->setPosition(ccp(winSize.width / 
, winSize.height / 
));

        
this->setWalkAction(CCRepeatForever::create(CCAnimate::create(walkAnim)));

        
this->getBear()->runAction(
this->getWalkAction());

        spriteSheet->addChild(
this->getBear());

bRet = 
true;

    } 
while (
);

    
return bRet;

}

以上各个步骤说明如下:

①.缓存精灵帧和纹理。调用CCSpriteFrameCache的addSpriteFramesWithFile方法,传入之前生成的属性列表文件名称。这个方法做了如下事情:

  • 从属性列表文件的元数据部分,取出textureFileName的值,作为纹理文件的文件名,在这里为AnimBear.png,载入文件到CCTextureCache纹理缓存中。注意,这里会根据设定的资源搜索路径来自动寻找正确的文件。
  • 解析属性列表文件,使用CCSpriteFrame对象来内部地跟踪所有精灵的信息。

②.创建一个精灵批处理节点。创建CCSpriteBatchNode对象,传入了精灵表单图像名称。精灵表单的工作方式如下:

  • 创建CCSpriteBatchNode对象,传入包含所有精灵的图像文件的名称,将这个对象添加到场景里面。
  • 现在,任何时候创建来自这个精灵表单的精灵,都应当将这个精灵添加到这个CCSpriteBatchNode对象里。只要精灵是来自这个精灵表单的,那么就会正常工作,否则会报错。
  • CCSpriteBatchNode代码智能地将CCSprite孩子对象在一次的OpenGL ES调用中进行绘制,而不是多次调用,而这会使得速度快得多。

③.采集帧列表。为了创建帧列表,需要简单地遍历图片的名称(它们被命名为Bear1.png -> Bear8.png,这是一个惯例),然后,从CCSpriteFrameCache里寻找指定名称的精灵帧。请记住,这些应该已经在缓存中,因为之前调用了addSpriteFramesWithFile方法。

④.创建动画对象。通过传入精灵帧列表,创建CCAnimation对象,并指定动画的播放速度。这里使用0.1秒作为帧之间的延迟时间。

⑤.创建精灵和运行动画动作。以某一帧来创建精灵(即熊),放置在屏幕中心。传入CCAnimation对象,创建CCAnimate对象,并让熊运行这个动作。最后,将熊添加到精灵表单里。注意,如果没有添加到精灵表单里,而是添加到层里的话,就不会得到性能的优化。

为了能在不同分辨率下,加载不同的资源,需要先设置下分辨率适配,打开
AppDelegate.cpp文件,在
applicationDidFinishLaunching函数里面,最上面代码修改为: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

 
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();

pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());

CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();

CCSize designSize = CCSizeMake(

);

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionNoBorder);

CCSize frameSize = CCEGLView::sharedOpenGLView()->getFrameSize();

CCSize resourceSize;

std::vector<std::string> searchPath;


if (frameSize.height > 
)

{

    searchPath.push_back(
"HDR");

    resourceSize = CCSizeMake(

);

}


else 
if (frameSize.height > 
)

{

    searchPath.push_back(
"HD");

    resourceSize = CCSizeMake(

);

}


else

{

    searchPath.push_back(
"SD");

    resourceSize = CCSizeMake(

);

}

pDirector->setContentScaleFactor(resourceSize.height / designSize.height);

CCFileUtils::sharedFileUtils()->setSearchPaths(searchPath);

编译运行,可以看到熊愉快地漫步在屏幕上,如下图所示:







4.更改熊行走的方向。通过触摸屏幕,来控制熊的移动。打开
HelloWorldScene.cpp文件,在
init函数里面,注释掉代码
this->getBear()->runAction(this->getWalkAction());,这样一开始熊就不会移动。然后在代码最后添加如下代码: 

1

 
this->setTouchEnabled(
true);

添加如下方法: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

 
void HelloWorld::registerWithTouchDispatcher()

{

    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
this, 

true);

}

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)

{

    
return 
true;

}

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)

{

    
//1) Determine the touch location
    CCPoint touchLocation = 
this->convertTouchToNodeSpace(pTouch);

//2) Set the desired velocity
    CCSize screenSize = CCDirector::sharedDirector()->getWinSize();

    
float bearVelocity = screenSize.width / 
.0f;

//3) Figure out the amount moved in X and Y
    CCPoint moveDifference = ccpSub(touchLocation, 
this->getBear()->getPosition());

//4) Figure out the actual length moved
    
float distanceToMove = ccpLength(moveDifference);

//5) Figure out how long it will take to move
    
float moveDuration = distanceToMove / bearVelocity;

//6) Flip the animation if necessary
    
if (moveDifference.x < 
)

    {

        
this->getBear()->setFlipX(
false);

    } 

    
else

    {

        
this->getBear()->setFlipX(
true);

    }

    

    
//7) Run the appropriate actions
    
this->getBear()->stopAction(
this->getMoveAction());

if (!_bearMoving)

    {

        
this->getBear()->runAction(
this->getWalkAction());

    }

    

    
this->setMoveAction(CCSequence::create(

        CCMoveTo::create(moveDuration, touchLocation),

        CCCallFunc::create(
this, callfunc_selector(HelloWorld::bearMoveEnded)),

        
NULL));

this->getBear()->runAction(
this->getMoveAction());

    _bearMoving = 
true;

}

void HelloWorld::cleanup()

{

    CC_SAFE_RELEASE_NULL(_moveAction);

    CCLayer::cleanup();

}

void HelloWorld::bearMoveEnded()

{

    
this->getBear()->stopAction(
this->getWalkAction());

    _bearMoving = 
false;

}


bearMoveEnded方法被调用时,不再移动,停止动画。
ccTouchEnded方法说明如下:

  • ①确定触摸位置。转换触摸点到本地节点坐标。
  • ②设置期望的速度。设置熊的移动速度。
  • ③计算在x轴和y轴上的移动距离。
  • ④计算移动的真实长度。
  • ⑤计算移动的所需时间。
  • ⑥如有必须的话,则翻转动画。通过移动距离的x轴来判断熊是向左还是向右移动。只需设置水平翻转,运行的动画也会跟着翻转。
  • ⑦运行适当的动作。首先,停止现有的移动动作,因为可能半途改变熊的目的地。接着,如果已经在移动了,就继续保持行走动作。最后,创建移动动作,指定移动的位置、移动的时间,和一个动作完成时的回调,这个回调用来停止行走动作。变量_bearMoving用来判断是否正在移动中。

编译运行,触摸屏幕来移动熊,如下图所示:





参考资料:

2.
http://www.codeandweb.com/texturepacker/documentation

非常感谢以上资料,本例子源代码附加资源
下载地址
http://download.csdn.net/detail/akof1314/5914987

如文章存在错误之处,欢迎指出,以便改正。

如何使用动画和精灵表单 Cocos2d-x 2.1.4的更多相关文章

  1. [一位菜鸟的COCOS-2D编程之路]精灵表单的制作以及简易动画的生成

    1.第一步:使用Zwoptex 制作精灵表单 2.制作的表单的名称为 cocos2Dpng,cocos2D.plist: 3.精灵的动画效果 主要分为五部分. // on "init&quo ...

  2. Cocos2d学习之路三(使用Zwoptex创建精灵表单和CCAnimate动画)

    创建精灵表单: 创建动画先要把图片整合到一个图片上然后生成plist文件: 方法下载Zwoptex软件:http://www.zwopple.com/zwoptex/ 然后打开选择 create ne ...

  3. jQuery和CSS3超酷表单美化插件

     这是一款效果很精美炫酷的jQuery和CSS3联系方式表单美化插件.大多数站点上都有让用户填写的联系方式表单,一个设计良好的表单可以大大的提升用户的体验度.该表单美化插件在原生HTML表单的基础上进 ...

  4. Vue.js表单校验;动画指令;避免内存泄露。

    Vue.js表单校验: 动画指令:创建自定义的滚动指令. 避免内存泄露. 避免内存泄露 在单页面应用开发时SPA,用户无需刷新浏览器.所以javascript应用需要自行清理组件来防止内存占用不断增长 ...

  5. 一款基于jquery ui的动画提交表单

    今天要给大家分享一款基于jquery ui的动画提交表单.这款提交表单的的效果是以动画的形式依次列表所需填写的信息.效果非常不错,效果图如下: 在线预览   源码下载 实现的代码. html代码: & ...

  6. Layui动画、按钮、表单

    Layui动画.按钮.表单 在实用价值的前提之下,我们并没有内置过多花俏的动画.而他们同样在 layui 的许多交互元素中,发挥着重要的作用.layui 的动画全部采用 CSS3,因此不支持ie8和部 ...

  7. 提升用户体验的最佳免费 jQuery 表单插件

    网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...

  8. Cleave.js – 自动格式化表单输入框的文本内容

    Cleave.js 有一个简单的目的:帮助你自动格式输入的文本内容. 这个想法是提供一个简单的方法来格式化您的输入数据以增加输入字段的可读性.通过使用这个库,您不需要编写任何正则表达式来控制输入文本的 ...

  9. 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件

    表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ...

随机推荐

  1. 打开tcp_tw_recycle引起的一次投诉分析

    背景: 我们有个基于oauth2.0协议给第三方授权以及信息的业务,年前对接入层.业务层做了次迁移.业务架构简单介绍下: lvs接入---> nginx ---> tomcat   问题: ...

  2. the elements of computing systems 的读书笔记2

    懒癌发作,本来计划是两到三天就一个unit的,没想到一直拖到今天才完成第二部分(6-8章). 第6章,介绍了hack汇编到二进制,也就是用翻译到01来表示.从课后习题来看,这一章目的就是设计一个程序( ...

  3. opencv+vs2012环境搭建教程

    1. 安装OpenCV和VS. 本人电脑安装的是opencv2.4.10和vs2012 2.配置环境变量 以下以win8 64位系统为例: 计算机->属性->高级系统设置->环境变量 ...

  4. Caffe2(3)----下载现成的模型并使用

    Caffe2训练好的模型可在Model Zoo下载,下载的命令很简单,接下来以下载和使用squeezenet为例,进行简单说明. 1.浏览可下载的模型 已有模型都放在github上,地址:https: ...

  5. JS数组与PHP数组的对比

    一.分类与创建 1:JS的数组都是索引数组,数组是一种特殊的对象,创建数组的方式有两种 //方式一 var arr1 = ['关羽', '张飞', '赵云', '马超', '黄忠']; //方式二 v ...

  6. ThinkPHP空操作和空控制器的处理

    所谓的空操作和空控制器,简而言之就是系统中不存在该方法或控制器,导致系统报错(本文版本3.2.3). 正确URL(测试环境):  http://oa.com/index.php/admin/publi ...

  7. linux下TP5安装好Workerman 报错:Class 'think\worker\Server' not found

    今天把功能放到服务器,本地测试正常,上传到服务器上报错Class 'think\worker\Server' not found 首先想到的是Windows和Linux下大小写的问题,查看了代码,并没 ...

  8. mysql 源代码编绎

    http://blog.chinaunix.net/uid-20723616-id-769326.html https://software.intel.com/zh-cn/blogs/2010/08 ...

  9. web语义化,从松散到实战

    GitHub:http://liu12fei08fei.github.io/html/4semantic.html web语义化,从松散到实战 在这篇文章之前,我放弃了很多次,写关于语义化方面的文章: ...

  10. POJ 1151 Atlantis 求矩阵面积并 扫描线 具体解释

    题意: 给定n个矩阵的左下角和右上角坐标,求矩阵面积并(矩阵总是正放的,即与x轴y轴都平行) 思路: 扫描线裸题 http://www.cnblogs.com/fenshen371/p/3214092 ...