经过前几个篇章对基础知识的梳理,再加上自身所学知识,相信对搭建出一些简单场景已经是信手捏来。但是只用到之前的知识搭造的场景基本都是静态的。但为了控制游戏人物做出移动、跳跃、旋转等动作,Action类是必不可少的。
Action类的方法介绍:
virtual std::string description() 获取动作的描述信息字符串。
virtual Action* clone() 获取这动作的克隆对象。
virtual Action* reverse() 获取这动作的相反对象(如向左转90度的动作 相反动作则是向右转90度)。
virtual bool isDone() 获取动作是否之行结束,若结束返回true。
Node* getTarget() 获取动作的目标节点。
void setTarget(Node * target) 设置动作的目标节点。
int getTag() 获取标签。
void setTag(int tag) 设置动作标签。
那么Action类该怎么使用?
详细看过节点类Node篇的应该对node->runAction(Aciton * action);这个方法不陌生,这个就是节点执行动作的方法。
以精灵做例子:
sprite->runAction(action); // 精灵sprite执行一个名叫action的动作
但是Action类是动作的基类,具体动作要通过其子类实现。
Cocos2dx中的各种动作都是继承自相同一个类Action,虽然实际开发中并不会直接用到Action,不过会经常使用它的子类对象。以下是动作类的继承树。
从继承树中不难看出Action动作类被分为3个子类:分别是Speed、FiniteTimeAction、Follow。
一、Speed动作
用于线性地改变某个动作的速度,因此可以实现倍数的快慢放功能。
通常用来实现改变节点动作的快慢。
二、Follow动作
用于一个节点跟随另一个节点做运动,可以实现摄像机跟拍等功能。
如精灵移动的同时,整个游戏层跟随移动,使得精灵对于镜头的位置不变等。
三、FiniteTimeAction最重要的基本动作相关类,其中又分成了两个种类的动作。
1、ActionInterval类
代表有变化的过程动作(可以看出普遍动作都有时间参数),以下创建的子类都是ActionInterval类的子类,相关子类创建实例的方法有:
①与移动相关:
static MoveBy* create(float duration,const Point& deltaPosition) //创建一个相对位置移动动作对象,参数一是持续时间,参数二是位移量。
static MoveTo* create(float duration,const Point& position) //创建一个绝对位置移动动作对象,参数一是持续时间,参数二是目标位置。
static JumpBy* create(float duration,const Point& position,float height,int jumps) //创建一个相对跳跃动作对象,参数一是持续时间,参数二是位移量,参数三是每次跳跃高度,参数四为跳跃次数。
static JumpTo* create(float duration,const Point& position,float height,int jumps)创建一个相 //绝对跃动作对象,参数一是持续时间,参数二是目标位置,参数三是每次跳跃高度,参数四为跳跃次数。
stattic BezierBy* create(float t,const ccBezierConfig& c) //创建一个相对赛贝尔曲线移动的动作对象,参数一是持续时间,参数二是曲线相关信息。
stattic BezierTo* create(float t,const ccBezierConfig& c) //创建一个相对赛贝尔曲线移动的动作对象,参数一是持续时间,参数二是曲线相关信息。
②与图形变换相关:
static RotateTo* create(float duration,float deltaAngleX,float deltaAngleY) //创建一个旋转动作,参数一是持续时间,参数二为绕X轴旋角度,参数三为绕Y轴旋转角度。
static RotateTo* create(float duration,float deltaAngle) //创建一个绝对旋转动作,参数一是持续时间,参数二为平面旋转到的目标角度。
static RotateBy* create(float duration,float deltaAngle) //创建一个相对旋转动作,参数一是持续时间,参数二是平面旋转角度。
static RotateBy* create(float duration,float deltaAngleZ_X,float deltaAngle Z_Y) //创建旋转动作对象,参数一是时间,参数二是Z轴和X轴中间的旋转角度,参数三是Z轴与Y轴的旋转角度。
stattic RotateBy* create(float duration,const Vertex3F& deltaAngle3D) //创建一个旋转动作对象,参数一是持续时间,参数二是一个三维向量,三个分量表示绕3个坐标轴的旋转角度。
static SkewTo* create(float t, float sx, float sy) //创建一个绝对偏斜动作对象,参数一是持续时间,参数二是X方向目标偏斜值,参数三是Y方向目标偏斜值。
static SkewBy* create(float t, float deltaSkewX, float deltaskewY) //创建一个相对偏斜动作对象,参数一是持续时间,参数二是X方向偏斜值增量,参数三是Y方向偏斜值增量。
static ScaleTo* create(float duration, float s) //创建一个绝对缩放对象,参数一是持续时间,参数二是目标缩放因子。
static ScaleTo* create(float duration,floatsx,floatsy) //创建一个绝对缩放对象,参数一是持续对象,参数二是目标缩放X方向因子,参数三是目标缩放Y方向因子。
static ScaleBy* create(float duration, float s) //创建一个相对缩放对象,参数一是持续时间,参数二是缩放因子增量。
static ScaleBy* create(float duration,floatsx,floatsy) //创建一个相对缩放对象,参数一是持续对象,参数二是缩放X方向因子增量,参数三是缩放Y方向因子增量。
static Blink* create(float duration,int blinks) //创建一个闪烁动作对象,参数一是持续时间,参数二是闪烁次数。③与颜色有关:
static FadeOut* create(float d) //创建一个淡出动作的对象,d参数表示完全淡出所需时间。
static FadeIn* create(float d) //创建一个淡入动作的对象,d参数表示完全淡入所需时间。
static FadeTo* create(float duration,GLubyte opactiy) //创建一个绝对透明度变化动作的对象,参数一是持续时间,参数二是目标透明度值。
static TintTo* create(float duration,GLubyte red,GLubyte green,GLubyte blue) //创建一个从当前颜色变化到制定色彩的动作对象,参数一是持续时间,其余参数分辨对应目标颜色的RGB通道值。
static TintBy* create(float duration,GLubytedeltaRed,GLubyte deltaGreen,GLubytedeltaBlue) //创建一个从当前颜色变化到制定色彩的动作对象,参数一是持续时间,其余参数分辨对应目标颜色的RGB通道增量。
2、ActionInstant类
代表没过程的动作(所有动作都没有时间参数),直接打到最终效果的动作,以下创建的子类都是ActionInstant类的子类,相关子类创建实例的方法有:
static Hide * create() //创建一个隐藏动作对象。
static Show * create() //创建一个显示动作对象。
static ToggleVisibility * create() // 创建一个切换可见性的动作对象(原来可见变不可见,原来不可见变可见)。
static FlipX* create(bool x) //创建一个绕X轴翻转的动作,当参数为true时翻转。
static FlipY* create(bool x) //创建一个绕Y轴翻转的动作,同上。
static Place * create(const Point& pos) //创建一个重置位置的对象,pos表示位置坐标。
static RemoveSelf * create(bool isNeedCleanUp=true) //创建一个删除自身的动作对象,为true时清楚目标节点的所有动作和回调。
3、组合动作类
这个类不是直接继承FiniteTimeAction,而是ActionInterval的子类,它们的功能是把其他动作组合使用,相关子类有:
static Sequence* create(FiniteTimeAction * action1,......) //创建一个顺序执行动作对象,参数是FiniteTimeAction实例,可以插入多个参数,最后必须防止NULL参数作结尾。
static Sequence* create(const Vector<FiniteTimeAction * >& arrayOfActions) //同上,参数是放置多个动作的容器。
static Sequence* createWithVariableList(FiniteTimeAction* action1,va_list args) //同上,参数一是指向一个动作序列头部的指针,参数二是变长参数。
static Sequence* createWithTwoActions(FiniteTimeAction* action1,FiniteTimeAction* action2)//创建两个动作组成的顺序动作对象。
static Repeat* create(FiniteTimeAction* action,unsigned int times) //创建一个重复动作对象,参数一是要重复的动作,参数二是重复次数。
static RepeatForever* create(FiniteTimeAction* action) //创建一个无限次重复对象。
static Spawn* create(FiniteTimeAction* action1,......) //创建一个多个动作同步执行动作,参数是FiniteTimeAction实例,可以插入多个参数,最后必须防止NULL参数作结尾。
static Spawn* create(const Vector<FiniteTimeAction * >& arrayOfActions) //同上,参数是放置多个动作的容器。
static Spawn* createWithVariableList(FiniteTimeAction* action1,va_list args) //同上,参数一是指向一个动作序列头部的指针,参数二是变长参数。
static Spawn* createWithTwoActions(FiniteTimeAction* action1,FiniteTimeAction* action2)//创建两个动作组成的同时动作对象。
4、动画类-Animate
用来播放帧动画的动作类,在下篇文章里会详细说明。