在前面的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测试项有大量与动作、动作管理和帧动画的实例代码,对学习动作的使用非常有帮助。
- [原创]cocos2d-x研习录-第三阶 特性之物理引擎
游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...
- [原创]cocos2d-x研习录-第三阶 特性之粒子系统
我想接触过游戏引擎的同学,对粒子系统应该不会陌生.它用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题.粒子系统在游戏中有着非常广泛的应用,可以模拟很多现象,如火花.爆炸.烟雾. ...
- [原创]cocos2d-x研习录-第三阶 特性之瓦片地图集
由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片.把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理. C ...
- [原创]cocos2d-x研习录-第三阶 特性之调度器
在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...
- [原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘
Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件.而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异. Cocos2D-x使用CCKeypadDeleg ...
- [原创]cocos2d-x研习录-第三阶 特性之加速度传感器
智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的体验,比如飞翔的企鹅(英文AirPenguin)游戏就是通过加速度传感器来控制角色的移动和跳跃方向.下面学习Cocos2D-x中如何使用加 ...
- [原创]cocos2d-x研习录-第三阶 特性之触屏
游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...
- [原创]cocos2d-x研习录-第三阶 多分辨率适配器
在移动终端(智能手机)平台下开发游戏一般都会涉及到屏幕多分辨率适配问题,原因是手机款式多种多样,不同的款式存在有不同的尺寸,即使尺寸相同又可能存在不同的分辨率. 手机屏幕尺寸:指手机屏幕对角线长度. ...
- [原创]cocos2d-x研习录-第三阶 背景音乐和音效
在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...
随机推荐
- 【1】springmvc4 + servlet3 零配置全注解入门项目helloword
自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https ...
- SQL sever 学习,2016,5,31,(重点:100行以后,字符串操作。)
--别名和表达式select OrderDate,YEAR(OrderDate)as 订单年份from orders; --选择select OrderDate,YEAR(OrderDate)as 订 ...
- iOS学习之cocoaPods
Cocoapods Cocoapods作用:iOS开发时,项目中会引用许多第三方库,CocoaPods可以用来方便的统一管理这些第三方库. 第一步安装: 下载安装CocoaPods需要Ruby环境 M ...
- ACM_1001_Exponentiation 详解
参考:http://blog.csdn.net/rually/article/details/8585268 #include<iostream> using namespace std; ...
- iOS UITableViewCell滑动删除
一般我们使用列表的形式展现数据就会用到UITableView.在熟练掌握了用UITableView展示数据以后,开发过程中可能会遇到需要删除数据的需求,我们想实现在一行数据上划动一下,然后出现一个删除 ...
- 小技巧:addobject: 和 addobjectsFromArray 的区别
NSArray *array1 = [NSArray alloc]init]; NSArray *array2 = [NSArray alloc]init]; [array1 addobject: a ...
- C# 将对象保存为文件 读取文件并转为对象 压缩文件 解压缩文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- Xcode 的一些调式技巧
XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序.下面将介绍一些常用的命令以及调试技巧. po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 ...
- jquery实现自动补全邮箱地址
开始做的邮箱补全代码 //检查email邮箱 function isEmail(str) { if (str.indexOf("@") > 0) { return true; ...
- winform 使用 ReportViewer做报表
之前用过的水晶报表觉得有些麻烦,因此尝试了使用微软自带的报表. 第一种方法是 在winform界面上放置ReportViewer界面,相关的代码如下: public DataTable dt; pri ...