在很多游戏引擎中,都有各种各样的动作,以及各色各样的动作缓冲,以便达到不同的效果。
在cocos2d中,同样也有这样一大批动作缓冲类。
先让我们分析下动作是如何运行的吧。
1、动作的要素
一般的动作至少有2个要素,一个是时间、一个是目的地,可能是位置(距离),也可能是其他属性。
2、如果只考虑线性,不考虑缓冲,那么基本的计算公式就是:
当前属性 = 起始属性 + 逝去时间*(目标属性 - 起始属性)/总时间
这个公式变化一下就是:
当前属性 = 起始属性 + 逝去时间/总时间 * (目标属性-起始属性)
3、比率
我们可以看出,以上的公式中,只有逝去时间是变化的,我们设
比率rate = 逝去时间/总时间
在计算机中,这个逝去时间基本是线性累加的,我们如果想做各种缓冲,只需要改变rate即可。
下面我们来看下cocos2d中的动作类关于变化部分是如何设计的:
动作基类CCActionInterval中,动作会首先调用
-(void) step: (ccTime) dt
{
if( firstTick_ ) {
firstTick_ = NO;
elapsed_ = 0;
} else
elapsed_ += dt;
[self update: MIN(1, elapsed_/duration_)];
}
然后调用
-(void) update: (ccTime) t。
从上面我们可以看出,update的参数其实是一个比例,就是已经逝去时间/总时间,而不是所谓的ccTime。
这里之前我一直存在着误解,以为update中的t就像其他的update中的t一样是 逝去时间,其实大错特错,这个只是个比例
这个参数其实应该改下名字,叫做rate更好一点,只能在0到1之间变化。
现在我们来看下CCMoveTo的update函数吧
-(void) update: (ccTime) t
{
[target_ setPosition: ccp( (startPosition.x + delta.x * t ), (startPosition.y + delta.y * t ) )];
}
其中,delta是属性 位置之差,是不是和我们之前分析的一样呢。
缓冲函数:
他们的功能很简单,就是改变rate,让我们来看下CCEaseIn
-(void) update: (ccTime) t
{
[other update: powf(t,rate)];
}
这个函数很简单,就是将t替换成 t的rate次方,rate是可以设置的,其实就是一个幂函数,而起变化区间在0与1之间。我们来复习下中学的知识,看下幂函数的图像吧:
在0到1区间,由于指数rate是大于1的,所以就是下面的那些曲线,变化先慢后快。
而CCEaseOut呢,
-(void) update: (ccTime) t
{
[other update: powf(t,1/rate)];
}
这个更简单了,直接求个rate的倒数。
至于其他的缓冲函数,我就不一一列举了,要写自己的缓冲函数,必须先了解数学曲线哦。^_^