在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode、导演类CCDirector、场景类CCScene、布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素。特别是精灵类CCSprite,它是游戏的主要元素。记得在讲CCSprite时说过,它本质上就是一张二维的图片对象。这些图片对象被加载到游戏中,显示到屏幕中形成各种静态画面。但游戏除了静态画面,更多需要有动态效果(如动作、特效和动画),它将游戏角色性格和情绪活灵活现的表现出来。可以说,动态效果的好坏,会直接影响游戏的效果,它是游戏中至关重要、不可或缺的组成部分。             Cocos2D-x支持很多动作,在Cocos2D-x中处理动作的是动作类CCAction,它的类继承图如下:

   这张类继承关系图比较复杂,动作的基类是CCAction,通过继承它可以实现很多不同的动作,主要分为三大类:有限时间动作类CCFiniteTimeAction、移动速度类CCSpeed和跟随移动类CCFollow。其中有限时间动作类又分为瞬时动作类CCActionInstant和延时动作类CCActionInterval。CCActionInstant与CCActionInterval的主要区别是CCActionInstant没有执行过程,动作瞬间执行完成,而CCActionInterval执行需要一定的时间(或过程)。从上图可知,CCActionInterval的子类更为丰富,它们在游戏开发中是用得比较多的。
   还是来看一看动作基类CCAction的内部结构和功能。
  
   ·CCAction属性:
     CCNode* m_pOriginalTarget:执行动作的源目标(上一次执行此动作的目标)
     CCNode* m_pTarget:执行动作的目标
     int m_nTag:动作标签值
 
   ·CCAction方法:
     void startWithTarget(CCNode *pTarget):设置执行的动作目标
     //动作处理函数
     void step(float dt):动作执行步骤(每帧都会调用)
     void stop(void):动作停止(动作结束时调用)
     void update(float time):动作更新(time=0表示动作开始时调用,time=1表示动作完成时调用,time=0.5表示动作进行到中间时调用)
 
    这个动作基类CCAction很容易理解,它定义了执行动作的目标对象,要求必须是CCNode或其子类,为什么呢?
    还是回过头看一下CCNode中定义的一些动作相关的函数,如下:
    CCAction* runAction(CCAction* action):执行动作
    void stopAllActions(void) :停止所有动作
    void stopAction(CCAction* action):停止指定动作
    void stopActionByTag(int tag):停止指定标签动作
    CCAction* getActionByTag(int tag):获得指定标签动作
    unsigned int numberOfRunningActions(void):获取运行的动作个数
 
    原来在节点类CCNode中已定义了动作类CCAction的操作方法,并且节点类CCNode还支持执行多个动作,它是通过
         CCActionManager* m_pActionManager对多个动作类CCAction进行管理。它的机制是当CCNode执行runAction方法时,该方法会把动作对象通过CCActionManager的addAction方法添加到CCActionManager的动作序列中。CCActionManager通过定时刷新自己的update方法,并在这个方法中去调用动作对象序列中每个动作对象的step方法,这些step方法再根据自身的完成进度去update或结束动作。
 
    在动作基类CCAction定义了一些动作处理函数,其子类将重写这些函数,并在函数中通过改变CCNode及子类对象的一系列属性(如位置、旋转、缩放等),使其支持各种不同的动作(如移动、跳跃、闪烁、扭曲等)。
    有了以上的了解,关于如何使用动作,这个问题就变得非常简单,还是给出动作的简单用法代码:
    CCSprite* sprite = CCSprite::create("Images/grossini.png");//创建执行动作的目标对象
    CCActionInterval* action = CCRotateTo::create(1, 90); //创建支持旋转的动作类对象
    sprite->runAction(action);//动作执行对象调用执行动作方法
    三行代码就可以完成执行一个动作了。
 
   在Cocos2D-x中还支持一种动作,即动画类CCAnimate,它也是CCAction的子类。之所以单独提出来讲,是因为CCAnimate是按动画帧播放一系列二维的图片对象序列,使其产生动画效果(又叫逐帧动画或帧动画)。这种动画效果在游戏开发中随处可见,所以有必要了解一下它。
  要实现CCAnimate的帧动画,还需要用到类CCAnimation。CCAnimation是用于加载并存储动画帧(即序列图片)。
  Cocos2D-x提供了两种方式加载帧动画。
 
  ·手动添加帧序列方式
      这种方式是直接从图片加载帧序列,使用方法如下:
      CCSprite* sp = CCSprite::create("Images\sprite.png");//创建精灵对象(用于执行动作)
      //加载精灵帧序列
      CCAnimation* animation = CCAnimation::create();
      animation->addSpriteFrameWithFileName("Images\animate1.png"); 
      animation->addSpriteFrameWithFileName("Images\animate2.png");
      animation->addSpriteFrameWithFileName("Images\animate3.png");
      animation->addSpriteFrameWithFileName("Images\animate4.png");
 
      animation->setDelayPerUnit(2.8f/4.0f);//设置帧间隔的时间
      animation->setRestoreOriginalFrame(true);//设置动画播放完后回到第一帧
      animation->setLoops(-1);//设置动画循环次数(-1表示无限循环)
 
      CCAnimate* animate = CCAnimate::create(animation); //创建动作对象
      sp->runAction(CCSequence::create(animate,animate->reverse(),NULL));//执行动作
 
  ·使用plist配置文件方式
      plist配置文件用于描述每一张图片的位置、大小等信息,程序通过plist配置文件的描述信息找到并加载每一张图片。Cocos2D-x中使用类CCAnimationCache负责读取plist配置文件,并加载精灵帧序列返回给CCAnimation。使用方法如下:
     CCSprite* sp = CCSprite::create("Images\sprite.png");//创建精灵对象(用于执行动作)
     //加载精灵帧序列
     CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache();
     cache->addSpriteFramesWithFile("Images\animate.plist");
     CCAnimation *animation = cache->animationByName("animate");
 
     animation->setDelayPerUnit(2.8f/4.0f);//设置帧间隔的时间

     animation->setRestoreOriginalFrame(true);//设置动画播放完后回到第一帧
     animation->setLoops(-1);//设置动画循环次数(-1表示无限循环)
    
     CCAnimate* animate = CCAnimate::create(animation); //创建动作对象
     sp->runAction(CCSequence::create(animate,animate->reverse(),NULL));//执行动作
    
  上面代码都用到类CCSequence,它是从CCActionInterval继承而来,用于运行动作序列。
    
     下面这张图是帧动画的类关联图,它对于梳理帧动画流程很有帮助。
 
       关于Cocos2D-x的动作就介绍到这里,可能还有网格动作没介绍,这个就留给大家自己去钻研了。
       在TestCpp工程的ActionTest、ActionManagerTest、ActionEaseTest、ActionProgressTest测试项有大量与动作、动作管理和帧动画的实例代码,对学习动作的使用非常有帮助。
-------------------------------------------------------------------------------------------------------------------

注:本人在本博客的原创文章采用创作共用版权协议http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。

最新文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(3)-漂亮系统登陆界面
  2. 小身材大用途,用PrimusUI驾驭你的页面
  3. 。net 之view筛选
  4. 【2016年特别福利】史上最全CSS学习资料大全
  5. Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
  6. 移动端浏览器隐私模式/无痕模式使用本地存储localStorage/sessionStorage的问题
  7. JavaScript日期时间操作
  8. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法
  9. 疯狂学习java web2(css)
  10. shell -- yes or no
  11. 【RabbitMQ+Python入门经典】兔子和兔子窝 笔记
  12. linux服务器用ssh 公钥下载代码 创建公钥,添加
  13. Java基本概述
  14. Django 数据表更改
  15. Python 类的式列化过程解剖
  16. PMM安装-第一篇
  17. 删除list中的特定元素
  18. 2069: [POI2004]ZAW
  19. Winform中产生验证码图片
  20. Python之上下文管理器

热门文章

  1. Linux 终端常用快捷键
  2. 自己动手做logo
  3. BZOJ 3594 方伯伯的玉米田
  4. Ubuntu 16.04 64位安装insight 6.8
  5. 推荐一个自动抽取pdf高亮笔记的web应用
  6. 面向小白的JS笔记 - #Codecademy#学习笔记
  7. Page 指令的各个属性及其功能
  8. MVC+MQ+WinServices+Lucene.Net Demo
  9. 《深入浅出Node.js》第6章 理解 Buffer
  10. 转 git安装配置