下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画。

下面我们再看看具体的程序代码,首先看一下看HelloWorldScene.h文件,它的代码如下:

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3. #include "cocos2d.h"
  4. class HelloWorld : public cocos2d::Layer
  5. {
  6. bool isPlaying; //播放标识                                                                                                  ①
  7. cocos2d::Sprite* sprite;                                                                                                        ②
  8. public:
  9. static cocos2d::Scene* createScene();
  10. virtual bool init();
  11. voidOnAction(cocos2d::Ref* pSender);                                                                                       ③
  12. CREATE_FUNC(HelloWorld);
  13. };
  14. #endif // __HELLOWORLD_SCENE_H__

第①行代码是声明一个布尔变量isPlaying,用来保存播放状态,true时候说明正在播放,false时候说明停止播放。第②行代码cocos2d::Sprite*sprite是声明一个精灵变量。第③行声明了一个函数,用来在选择不同菜单时候的回调。

  1. HelloWorldScene的实现代码HelloWorldScene.ccp文件,其中HelloWorld::init()函数代码如下:
  2. bool HelloWorld::init()
  3. {
  4. if( !Layer::init() )
  5. {
  6. returnfalse;
  7. }
  8. SizevisibleSize = Director::getInstance()->getVisibleSize();
  9. Pointorigin = Director::getInstance()->getVisibleOrigin();
  10. SpriteFrameCache::getInstance()->addSpriteFramesWithFile("run.plist");
  11. autobackground = Sprite::createWithSpriteFrameName("background.png");
  12. background->setAnchorPoint(Point::ZERO);
  13. this->addChild(background,0);
  14. sprite= Sprite::createWithSpriteFrameName("h1.png");
  15. sprite->setPosition(Point(visibleSize.width/2,visibleSize.height /2));
  16. this->addChild(sprite);
  17. isPlaying= false;
  18. //toggle菜单
  19. autogoSprite = Sprite::createWithSpriteFrameName("go.png");                                                 ①
  20. autostopSprite = Sprite::createWithSpriteFrameName("stop.png");                                           ②
  21. autogoToggleMenuItem = MenuItemSprite::create(goSprite, goSprite);                                    ③
  22. auto stopToggleMenuItem = MenuItemSprite::create(stopSprite,stopSprite);                            ④
  23. auto toggleMenuItem = MenuItemToggle::createWithCallback(
  24. CC_CALLBACK_1(HelloWorld::OnAction,this),
  25. goToggleMenuItem , stopToggleMenuItem, NULL);                                             ⑤
  26. toggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(930,540)));                   ⑥
  27. auto mn = Menu::create(toggleMenuItem, NULL);
  28. mn->setPosition(Point::ZERO);
  29. this->addChild(mn);
  30. returntrue;
  31. }

上述代码第①行是创建Go按钮精灵,对应的第③行代码是创建Go按钮(菜单项)。代码第②行是创建Stop按钮精灵,对应的第④行代码是创建Stop按钮(菜单项)。在第⑤行代码是创建Go和Stop是两种状态切换的开关菜单项。第⑥行代码是设置开关菜单项的位置。

HelloWorldScene的实现代码HelloWorldScene.ccp文件,其中HelloWorld::OnAction(Ref*pSender)函数代码如下:

  1. void HelloWorld::OnAction(Ref* pSender)
  2. {
  3. if(!isPlaying) {
  4. ///////////////动画开始//////////////////////
  5. Animation*animation = Animation::create();                                                                    ①
  6. for(int i=1; i<= 4; i++)
  7. {
  8. __String*frameName = __String::createWithFormat("h%d.png",i);                                    ②
  9. log("frameName= %s",frameName->getCString());
  10. SpriteFrame*spriteFrame = SpriteFrameCache::getInstance()->
  11. getSpriteFrameByName(frameName->getCString());                                  ③
  12. animation->addSpriteFrame(spriteFrame);                                                                           ④
  13. }
  14. animation->setDelayPerUnit(0.15f);           //设置两个帧播放时间                             ⑤
  15. animation->setRestoreOriginalFrame(true);    //动画执行后还原初始状态                   ⑥
  16. Animate*action = Animate::create(animation);                                                                          ⑦
  17. sprite->runAction(RepeatForever::create(action));                                                         ⑧
  18. //////////////////动画结束///////////////////
  19. isPlaying= true;
  20. }else {
  21. sprite->stopAllActions();                                                                                               ⑨
  22. isPlaying= false;
  23. }
  24. }

上述第①行代码是创建一个Animation对象,它是动画对象,然后我们要通过循环将各个帧图片放到Animation对象中。第②行是获得帧图片的文件名,String类型是Cocos2d-x字符串数据类型。第③行代码是通过帧名创建精灵帧对象,第④行代码把精灵帧对象添加到Animation对象中。

第⑤行代码是animation->setDelayPerUnit(0.15f)是设置两个帧播放时间,我们这个动画播放是4帧。第⑥行代码animation->setRestoreOriginalFrame(true)是动画执行完成是否还原到初始状态。第⑦行代码是通过一个Animation对象创建Animate对象,第⑧行代码sprite->runAction(RepeatForever::create(action))是执行动画动作,无限循环方式。

第⑨行代码sprite->stopAllActions()停止所有的动作。

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:257760386、327403678

Cocos2d-x开发实例介绍帧动画使用的更多相关文章

  1. Cocos2d-x Lua中实例:帧动画使用

    下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. 帧动画实例 下面我们再看看具体的程序代码,首 ...

  2. Cocos2d-x开发实例介绍特效演示

    下面我们通过一个实例介绍几个特效的使用,这个实例下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的特性动作,点击Back按钮可以返回到菜单 ...

  3. cocos2d-x游戏开发(十六)帧动画

    欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11775745 本来想写一下帧动画的,搜了一下网上好像有一大把,就懒得写了,直接贴代码. // ...

  4. Android动画系列之帧动画和补间动画

    原文首发于微信公众号:jzman-blog,欢迎关注交流! Android 提供三种动画:帧动画.补间动画和属性动画,本篇文章介绍帧动画以及补间动画的使用,属性动画的使用将在后面的文章中分享,那就来复 ...

  5. android 动画基础绘——帧动画(三)

    前言 这篇介绍帧动画. 什么是帧动画? 帧动画,非常好理解.就是轮播,比如我们看电视,其实就是一张一张播放过去的. 正文 <?xml version="1.0" encodi ...

  6. Qt移动应用开发(三):使用精灵图片实现帧动画

    Qt移动应用开发(三):使用精灵图片实现帧动画 上一篇博文讲到了Qt Quick对于动画的一般支持.动画的形式多样,配合不同的插值函数,能够差点儿实现全部想要的动画效果,而对于游戏的一些特殊的效果比方 ...

  7. Android开发——View动画、帧动画和属性动画详解

    0. 前言   Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图 ...

  8. 《HTML 5网页开发实例具体解释》样章、内容简单介绍、前言

    http://spu.jd.com/1167757597.html http://product.dangdang.com/23484942.html 样章 http://download.csdn. ...

  9. [Cocos2d-x开发问题-3] cocos2dx动画Animation介绍

    Cocos2d-x为了减少开发难度,对于动画的实现採用的帧动画的方案.这也就是说Cocos2d-x中的动画是帧动画. 帧动画的原理相信大家都不陌生,就是多张图片循环播放以实现动画的效果. 一个简单的动 ...

随机推荐

  1. 英特尔实感3D摄像头

    RealSense 3D(实感3D)是英特尔提供的一套感知计算解决方案,包括了手势的识别.控制,人脸的识别.认证.控制,语音识别与控制,增强现实,3D扫描和重构等许多先进的技术.包括立体眼镜(暂未公开 ...

  2. UVa 11111 Generalized Matrioshkas

    嵌套玩具, 要求外层玩具的尺寸比内层玩具尺寸的和要大. 每一个玩具由一个负数与相应的正数表示, 在这两数之间的部分即为此玩具内部的玩具. 要求判断一串输出的数字是否能组成一个合法的玩具. 一个合法的玩 ...

  3. Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积

    Problem A. AerodynamicsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/co ...

  4. vector<int> v2 = 42; 为何非法

    C++ Primer 第四版,第十三章“复制控制” 习题13.2,为何vector<int> v2 = 42; 不能编译? 百度贴吧里的一位楼主给出了答案,本人认为正确,特此引用: 参考链 ...

  5. DWRUtil is not defined

    错误:DWRUtil is not defined; 解决方法: 先检查页面中是否正确引入uitl.js <script type="text/javascript" src ...

  6. Metadata Lock原理7

    http://blog.itpub.net/22664653/viewspace-1791744/ 一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合 ...

  7. 高级I/O之存储映射I/O

    存储映射I/O(Memory-mapped I/O)使一个磁盘文件与存储空间中的一个缓冲区相映射.于是当从缓冲区中取数据,就相当于读文件中的相应字节.与此类似,将数据存入缓冲区,则相应字节就自动地写入 ...

  8. 理解php Hash函数,增强密码安全

    1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...

  9. Helpers\GeoCode

    Helpers\GeoCode This function connects to google maps and retrieves the lat/lon of the address provi ...

  10. 如何在VS C++中高亮用户自定义关键字

    这篇文章主要参考一篇英文博客,具体步骤如下: 1.在VS中找到msdev.exe所在的目录,一般在...\Microsoft Visual Studio.NET\Common7\IDE\devnev. ...