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. sqlserver 序号重新计算

    DBCC CHECKIDENT('leshua_TradeData',NORESEED) DBCC CHECKIDENT('表名',NORESEED)

  2. css3 word-wrap属性

    允许长单词换行到下一行: word-wrap:break-word

  3. win10 + 独显 + Anaconda3 + tensorflow_gpu1.13 安装教程(跑bert模型)

    这里面有很多坑,最大的坑是发现各方面都装好了结果报错  Loaded runtime CuDNN library: 7.3.1 but source was compiled with: 7.4.1, ...

  4. 2018-8-10-git-使用-VisualStudio-比较分支更改

    title author date CreateTime categories git 使用 VisualStudio 比较分支更改 lindexi 2018-08-10 19:16:52 +0800 ...

  5. oracle用索引提高效率

    索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最 ...

  6. tensorflow入门——5tensorflow安装

    你将把你学到的神经网络的知识,借助 TensorFlow ,一个 Google 开源的深度学习框架,应用在真实的数据集中. 你将使用 TensorFlow 来辨别 notMNIST 数据集.它是一个由 ...

  7. 【a503】圆排列问题

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 给定n个大小不等的圆c1,c2,...., cn,现要将这n个圆排列进一个矩形框中,且要求各圆与矩形框的 ...

  8. gSOAP 使用

    1. wsdl2h 生成服务定义头文件 wsdl2h -o calc.h http://www.genivia.com/calc.wsdl 2. 从服务定义头文件calc.h生成客户端代码 soapc ...

  9. 洛谷P1280 尼克的任务 题解 动态规划/最短路

    作者:zifeiy 标签:动态规划.最短路 题目链接:https://www.luogu.org/problem/P1280 题目大意: 有k个任务分布在第1至n这n个时间点,第i个任务的于第 \(P ...

  10. H3C OSPF基本配置命令