Cocos中定义了一系列基本动作,可以方便我们制作简单的效果。
本文仅供个人记录和复习,不用于其他用途
3.x版本变化
- 去掉
CC - 更新了一些动作
CallFunc有了新用法,具体请看回调函数一章
CCAction
CCAction只是一个基类,它的派生类才是我们实际使用的动作。派生类如下:
CCFiniteTimeAction:与时间相关的动作类CCFollow:跟随动作类CCSpeed:速度类
动作管理
下面是一些常见操作,适用于所有的动作:
|
|
下面将分别介绍三个类各自的操作。
时间动作类CCFiniteTimeAction
CCFiniteTimeAction又分为CCActionInstant(瞬时动作)和CCActionInterval(持续动作)两个子类。
瞬时动作CCActionInstant
常见操作如下:
|
|
使用举例:
|
|
函数回调动作CCCallFunc
CCCallFunc是瞬时动作CCActionInstant的子类。它主要有三种函数回调动作类。三种函数回调的区别在于所带的参数个数:0、1、2。CCActionInstant在执行动作时,会调用这个函数。
|
|
使用举例:
|
|
持续动作CCActionInterval
常见操作如下:
|
|
使用举例:
|
|
组合动作
组合动作的类是CCActionInterval的子类,主要分为序列动作和重复动作。
|
|
使用举例:
|
|
延迟动作CCDelayTime
CCDelayTime是CCActionInterval的子类,用于序列CCSequence中,在两个动作之间加上一个等待时间。
|
|
缓动动作CCActionEase
CCActionEase也是CCActionInterval的子类,也是缓动动作的基类。这类动作在执行时速度可以变化,比如直线运动可以先加速再减速,又或者是自由落体运动是越来越快的,但是我们用的更多的是EaseRateAction类,该类继承了CCActionEase。
缓动动作的速度可以分为以下三种:
In:由慢变快Out:由快变慢InOut:由慢变快再变慢
需要注意的是,CCActionEase只能够改变某个持续动作执行时的速度,但是这个动作的时间是不会变的。由于这个类的具体实现比较复杂,这里只简单地举几个例子。
|
|
速度类CCSpeed
CCSpeed继承自CCAction,用于改变动作执行的速度。但不同于CCActionEase,动作执行的时间也会随着改变,也相当于一般意义上的加速。
|
|
跟随动作类CCFollow
CCFollow继承自CCAction,它能够让某个CCNode对象跟随另外一个对象移动。就好比我们在玩超级马里奥时,我们控制人物向前走,背景也会跟着显示前面的内容,而不是让我们的马里奥走到屏幕外面去。
使用方法:
|
|

综合运用
下面将结合几种常用动作,以及碰撞检测的知识,来做一个小的样例。
|
|
上面是init()方法以及定时器的update()方法的实现。这里我们创建了两个精灵,一个是英雄,一个是仙豆。那么,我们先让英雄以较慢的速度向右移动,当触碰到线仙豆时,英雄的速度加快。关于碰撞检测的实现,请看下面这张图:

由于英雄的boundingBox()过大,所以我们只能够自定义一个矩形。origin代表着hero的boundingBox的当前坐标(Rect左上角为原点),origin.x加50代表着矩形向右移动了50。当然,宽度我们必须减去100,不然的话就会提前碰到敌人。注意,size.width在减时是两边同时减,在这里就是左右两边同时减50。当然,由于矩形锚点在左上角,所以看起来只是右边减去了100。
效果如下:

我们会发现一点,hero不仅执行了动作,同时还执行了动画。runAction()可以同时运行动作和动画,但是不能同时运行两个动作或者两个动画。