ActionEase类有一系列的动作,有着类似的名字:EaseXxxxIn、EaseXxxxOut、EaseXxxxInOut,同时也有类似的行为:速度由快到慢、由慢到快、由慢到快再到慢。

原文作者确实牛皮,小弟只是整理一下,表示佩服

sineEaseIn

函数原型:-1 * cosf(time * (float)M_PI_2) + 1

f(x)表示变化的时间和完成进度的关系

g(x)表示的是时间和速度的关系

g(x)是f(x)的导数

变化趋势:先慢后快

sineEaseOut

函数原型:sinf(time * (float)M_PI_2)

f(x)表示变化的时间和完成进度的关系

g(x)表示的是时间和速度的关系

g(x)是f(x)的导数

变化趋势:先快后慢

sineEaseInOut

函数原型:-0.5f * (cosf((float)M_PI * time) - 1)

f(x)表示变化的时间和完成进度的关系

g(x)表示的是时间和速度的关系

g(x)是f(x)的导数

变化趋势:先慢后快再变慢

expoEaseIn

函数原型:time == 0 ? 0 : powf(2, 10 * (time/1 - 1)) - 1 * 0.001f

f(x)表示变化的时间和完成进度的关系

g(x)表示的是时间和速度的关系

g(x)是f(x)的导数

变化趋势:由慢到快

expoEaseOut

函数原型:time == 1 ? 1 : (-powf(2, -10 * time / 1) + 1)

f(x)表示变化的时间和完成进度的关系

g(x)表示的是时间和速度的关系

g(x)是f(x)的导数

变化趋势:由快至慢

expoEaseInOut

函数原型:

if(time == 0 || time == 1)
return time; if (time < 0.5f)
return 0.5f * powf(2, 10 * (time * 2 - 1)); return 0.5f * (-powf(2, -10 * (time * 2 - 1)) + 2);

f(x)和f1(x)表示变化的时间和完成进度的关系

h(x)p(x)是分段函数的导数

变化趋势:由慢至快再由快至慢

[外链图片转存失败(img-GHgJtaKC-1565143115827)(/Users/red_4/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/648268816/QQ/Temp.db/50635A47-1232-4134-B1CC-1CF848B9E4F8.png)]

easeIn

函数原型:powf(time, rate)

变化趋势:由慢变快

easeOut

函数原型:powf(time, 1 / rate)

变化趋势:由快变慢

easeInOut

函数原型:

float easeInOut(float time, float rate)
{
time *= 2;
if (time < 1)
{
return 0.5f * powf(time, rate);
}
else
{
return (1.0f - 0.5f * powf(2 - time, rate));
}
}

变化趋势:

当time<1时,快->慢->快 reserve:慢->快->慢

当time>1时,慢->快->慢 reserve:快->慢->快

backEaseIn

函数原型:

float backEaseIn(float time)
{
float overshoot = 1.70158f;
return time * time * ((overshoot + 1) * time - overshoot);
}

变化趋势:先向负轴移动一小节再移动会原点(快->慢->快),然后向正轴移动(慢->快)

可应用于射箭。

蓝色是时间-位移函数

红色是时间-速度函数

backEaseOut

函数原型:

float backEaseOut(float time)
{
float overshoot = 1.70158f; time = time - 1;
return time * time * ((overshoot + 1) * time + overshoot) + 1;
}

变化趋势:【BackIn倒着放】先向正轴移动(慢->快),然后向终点正轴方向多移动一小节再移动会终点。(快->慢->快)

backEaseInOut

函数原型:

float backEaseInOut(float time)
{
float overshoot = 1.70158f * 1.525f; time = time * 2;
if (time < 1)
{
return (time * time * ((overshoot + 1) * time - overshoot)) / 2;
}
else
{
time = time - 2;
return (time * time * ((overshoot + 1) * time + overshoot)) / 2 + 1;
}
}

变化趋势:【backEaseIn从中间对称】先向负轴移动一小节再移动会原点(快->慢->快),然后向正轴移动(慢->快),到终点时先向终点方向多移动一段距离,然后移动回终点(快->慢->快)

蓝色是时间-位移函数

红色是时间-速度函数

bounceEaseIn

函数原型:

float bounceEaseIn(float time)
{
return 1 - bounceTime(1 - time);
}

变化趋势:【backEaseOut的镜像】如图是时间-位移函数图像

backEaseOut

函数原型:

float bounceEaseOut(float time)
{
return bounceTime(time);
}
float bounceTime(float time)
{
if (time < 1 / 2.75f)
{
return 7.5625f * time * time;
}
else if (time < 2 / 2.75f)
{
time -= 1.5f / 2.75f;
return 7.5625f * time * time + 0.75f;
}
else if(time < 2.5f / 2.75f)
{
time -= 2.25f / 2.75f;
return 7.5625f * time * time + 0.9375f;
} time -= 2.625f / 2.75f;
return 7.5625f * time * time + 0.984375f;
}

变化趋势:如图是时间-位移函数图像

其实质是模拟小球掉落的弹跳运动

bounceEaseInOut

函数原型:

float bounceEaseInOut(float time)
{
float newT = 0;
if (time < 0.5f)
{
time = time * 2;
newT = (1 - bounceTime(1 - time)) * 0.5f;
}
else
{
newT = bounceTime(time * 2 - 1) * 0.5f + 0.5f;
}
return newT;
}

变化趋势:如图是时间-位移函数图像

elasticEaseIn

函数原型:

float elasticEaseIn(float time, float period)
{ float newT = 0;
if (time == 0 || time == 1)
{
newT = time;
}
else
{
float s = period / 4;
time = time - 1;
newT = -powf(2, 10 * time) * sinf((time - s) * M_PI_X_2 / period);
} return newT;
}

变化趋势:如图是时间-位移函数图像

elasticEaseOut

函数原型:

 float elasticEaseOut(float time, float period)
{ float newT = 0;
if (time == 0 || time == 1)
{
newT = time;
}
else
{
float s = period / 4;
newT = powf(2, -10 * time) * sinf((time - s) * M_PI_X_2 / period) + 1;
} return newT;
}

变化趋势:如图是时间-位移函数图像

elasticEaseInOut

函数原型:

float elasticEaseInOut(float time, float period)
{ float newT = 0;
if (time == 0 || time == 1)
{
newT = time;
}
else
{
time = time * 2;
if (! period)
{
period = 0.3f * 1.5f;
} float s = period / 4; time = time - 1;
if (time < 0)
{
newT = -0.5f * powf(2, 10 * time) * sinf((time -s) * M_PI_X_2 / period);
}
else
{
newT = powf(2, -10 * time) * sinf((time - s) * M_PI_X_2 / period) * 0.5f + 1;
}
}
return newT;
}

变化趋势:前半段是elasticEaseIn后半段是elasticEaseOut

quadraticIn

函数原型:

powf(time,2)

quadraticOut

函数原型:

float quadraticOut(float time)
{
return -time*(time-2);
}

变化趋势:如图是时间-位移函数图像

从零开始のcocos2dx生活(五)ActionEase的更多相关文章

  1. 从零开始のcocos2dx生活(七)ParticleSystem

    CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...

  2. 从零开始のcocos2dx生活(二)Node

    节点 Node 文章目录 节点 Node 前言 变量初始化 创建一个节点对象 获取节点依赖的计数器 获取节点的描述(获取节点的Tag) 节点的局部层顺序值(LocalZOrder) 设置节点的Loca ...

  3. 从零开始のcocos2dx生活(十一)TableView

    目录 简述 主要变量 主要方法 setVerticalFillOrder reloadData cellAtIndex updateCellAtIndex insertCellAtIndex remo ...

  4. 从零开始のcocos2dx生活(十)ScrollView

    目录 简介 基础变量 ScrollViewDelegate Direction _dragging _container _touchMoved _bounceable _touchLength 方法 ...

  5. 从零开始のcocos2dx生活(九)CCBReader

    NodeLoaderLibrary是用来存储节点加载器类型的类,通过registerDefaultNodeLoaders()可以注册所有默认类型的加载器 在CocosBuilder的使用手册中: 1. ...

  6. 从零开始のcocos2dx生活(八)ParticleSystemQuad

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...

  7. 从零开始のcocos2dx生活(六)EventDispatcher

    EventDispatcher可能是所有的里面比较不容易理解也不容易看的 我说自己的理解可能会误导到你们-[索了你们看不下去>< 我写了几乎所有的代码的注释,有的是废话跳过就好 主要的代码 ...

  8. 从零开始のcocos2dx生活(一)内存管理

    cocos中所有的对象都是继承自Ref基类,Ref的职责就是对对象进行引用计数管理 内存管理中最重要的是三个方法retain().release().autorelease() 在cocos中创建对象 ...

  9. 从零开始のcocos2dx生活(四)ActionManager

    文章目录 初始化构造函数 析构函数 删除哈希元素 分配存放动作对象的空间 通过索引移除动作 暂停动作 恢复动作 暂停所有的动作 恢复所有的动作 添加动作 移除所有的动作 移除target中的所有动作 ...

随机推荐

  1. 爬虫:Selenium + PhantomJS

    更:Selenium特征过多(language/UserAgent/navigator/en-US/plugins),以Selenium打开的浏览器处于自测模式,很容易被检测出来,解决方法可选: 用m ...

  2. mysql 忘记root密码的处理办法

    参考地址: https://blog.csdn.net/vv19910825/article/details/82979563 1.修改配置文件mysql\bin\my.ini 在文本  [mysql ...

  3. CSDN-Java培训 - 看看这次会有多少人跟风...

    2019年5月8日,闲来无事(最近答辩还没事......),存个档. 看看这一波风口,记录互联网+教育.

  4. 随机线性网络编码的C语言实现,实现可靠传输:实现篇(2)

    伽罗华域(2^8)乘除法的编程实现

  5. Unity 鼠标控制视角功能和动画播放冲突解决办法

    环境是 unity 5.6.4 情况说明: 1 模型动画单独播放是没问题的. 2 鼠标控制模型是没问题的. 3 在start中播放模型动画,即使鼠标控制视角代码还挂载着,但是模型却无法用鼠标旋转等操作 ...

  6. 原生js实现多个随机大小颜色位置速度小球的碰壁反弹

    文章地址 https://www.cnblogs.com/sandraryan/ 需求:生成n个小球,让他们在一个大盒子中碰壁反弹,要求小球随机颜色,大小,初始位置,运动速度. 思路分析: 创建小球随 ...

  7. Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪

    在上篇文章中,我们用一个框架来回顾了主流的深度学习优化算法.可以看到,一代又一代的研究者们为了我们能炼(xun)好(hao)金(mo)丹(xing)可谓是煞费苦心.从理论上看,一代更比一代完善,Ada ...

  8. Python--day65--模板语言之filter

    参考的原文链接:http://www.cnblogs.com/liwenzhou/p/7931828.html Filters(过滤器) 在Django的模板语言中,通过使用 过滤器 来改变变量的显示 ...

  9. Python--day25--面向对象之封装

    狭义上的封装的例子:(例1)Python就只有两种类型:公有和私有,没有Java中说的那种保护类型 例2: 例3:正常的方法调用私有方法 封装总结:

  10. ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

    ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.You a ...