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. Python基础:09函数式编程

    Python支持一些函数式编程的特性.比如lambda. map().reduce().filter()函数. 一:匿名函数与lambda Python可以用lambda 关键字创造匿名函数.匿名函数 ...

  2. 从零学React Native之01创建第一个程序

    本篇首发于简书 欢迎关注 上一篇文章是时候了解React Native了介绍了React Native.大家应该对React Native有个初步的认识. 接下来我们就可以初始化一个React Nat ...

  3. H3C 路由器的作用

  4. 请求(RequestInfo)

    请求类型 StringRequestInfo 用在 SuperSocket 命令行协议中. 你也可以根据你的应用程序的需要来定义你自己的请求类型. 例如, 如果所有请求都包含 DeviceID 信息, ...

  5. HTML静态网页--框架

    框架: 1.frameset frameset最外层的去掉body,直接用frameset 在超级链接指定目标页面显示在哪个框架窗口中 第一步:给要显示内容的目标frame设置name属性 第二步:给 ...

  6. Educational Codeforces Round 11、A B题

    A. Co-prime Array 题意:给你一个数列,要求构造两两相邻之间的数互质的数列,可以插入的数的小于10的9次方 思路:其实可以选择靠近10的9次方的最大的三个素数.然后按我下面的方法做就可 ...

  7. pytorch中squeeze()和unsqueeze()函数介绍

    一.unsqueeze()函数 1. 首先初始化一个a 可以看出a的维度为(2,3) 2. 在第二维增加一个维度,使其维度变为(2,1,3) 可以看出a的维度已经变为(2,1,3)了,同样如果需要在倒 ...

  8. MYSQL设置远程账户登陆总结,mysql修改、找回密码、增加新用户,MySQL数据库的23个注意事项

    1.5 设置及修改Mysql root用户密码1 设置密码方法mysqladmin -u root password '123456'mysqladmin -u root -p'123456' pas ...

  9. P1091 剧院广场

    题目描述 柏林首都的剧院广场呈长方形,面积为 \(n \times m\) 平方米.在这座城市的周年纪念日之际,人们决定用方形花岗岩石板铺设广场.每块石板的大小都是 \(a \times a\) . ...

  10. Moq基础 判断方法被执行

    如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次 本文是一个系列,具体请看 Moq基础(一) 为什么需要单元测试框架 Moq基础(二) 快 ...