从零开始のcocos2dx生活(五)ActionEase
文章目录
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的更多相关文章
- 从零开始のcocos2dx生活(七)ParticleSystem
CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...
- 从零开始のcocos2dx生活(二)Node
节点 Node 文章目录 节点 Node 前言 变量初始化 创建一个节点对象 获取节点依赖的计数器 获取节点的描述(获取节点的Tag) 节点的局部层顺序值(LocalZOrder) 设置节点的Loca ...
- 从零开始のcocos2dx生活(十一)TableView
目录 简述 主要变量 主要方法 setVerticalFillOrder reloadData cellAtIndex updateCellAtIndex insertCellAtIndex remo ...
- 从零开始のcocos2dx生活(十)ScrollView
目录 简介 基础变量 ScrollViewDelegate Direction _dragging _container _touchMoved _bounceable _touchLength 方法 ...
- 从零开始のcocos2dx生活(九)CCBReader
NodeLoaderLibrary是用来存储节点加载器类型的类,通过registerDefaultNodeLoaders()可以注册所有默认类型的加载器 在CocosBuilder的使用手册中: 1. ...
- 从零开始のcocos2dx生活(八)ParticleSystemQuad
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...
- 从零开始のcocos2dx生活(六)EventDispatcher
EventDispatcher可能是所有的里面比较不容易理解也不容易看的 我说自己的理解可能会误导到你们-[索了你们看不下去>< 我写了几乎所有的代码的注释,有的是废话跳过就好 主要的代码 ...
- 从零开始のcocos2dx生活(一)内存管理
cocos中所有的对象都是继承自Ref基类,Ref的职责就是对对象进行引用计数管理 内存管理中最重要的是三个方法retain().release().autorelease() 在cocos中创建对象 ...
- 从零开始のcocos2dx生活(四)ActionManager
文章目录 初始化构造函数 析构函数 删除哈希元素 分配存放动作对象的空间 通过索引移除动作 暂停动作 恢复动作 暂停所有的动作 恢复所有的动作 添加动作 移除所有的动作 移除target中的所有动作 ...
随机推荐
- Java练习 SDUT-1586_计算组合数
计算组合数 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 计算组合数.C(n,m),表示从n个数中选择m个的组合数. ...
- python-----堡垒机前戏paramiko模块及进阶
堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: i ...
- oracle函数 LPAD(c1,n[,c2])
[功能]在字符串c1的左边用字符串c2填充,直到长度为n时为止 [参数]C1 字符串 n 追加后字符总长度 c2 追加字符串,默认为空格 [返回]字符型 [说明]如果c1长度大于n,则返回c1左边n个 ...
- Notepad++颜色配置
目前看着比较顺眼的notepad++配置,记录如下:
- Libev源码分析01:Libev中的监视器结构(C结构体实现继承)
在Libev的源码中,用到了一种用C实现类似C++中继承的技巧,主要是用宏和结构体实现. 在Libev中,最关键的数据结构就是各种监视器,比如IO监视器,信号监视器等等.这些监视器的多数成员都是一样的 ...
- sequence——强行推式子+组合意义
sequence 考虑长度<=x的方案数F(x),然后(F(x)-F(x-1))*x贡献到答案里 n平方的做法可以直接DP, 感觉有式子可言, 就推出式子:类似coat,每个长度为i的计算i次. ...
- poj 3601Tower of Hanoi
Tower of Hanoi Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 1895 Accepted: 646 De ...
- python 动态生成变量名以及动态获取变量的变量名
前言需求: 必须现在需要动态创建16个list,每个list的名字不一样,但是是有规律可循,比如第一个list的名字叫: arriage_list_0=[],第二个叫arriage_list_1=[] ...
- kindeditor编辑器微软雅黑样式font-family值变成"
http://www.100cm.cn/article-126-764.html kindeditor编辑器中选中文字, 修改字体(字体名称中带有空格, 例如"Microsoft YaHei ...
- 用adblock过滤页面上固定位置的悬浮窗
现在各种网站都喜欢加入position:fixed的悬浮窗,这些悬浮窗可以是分享按钮,可以是二维码,可以是各种烦人的按钮. 因为这些悬浮窗未必是广告,所以adblock很少自动屏蔽它们. 可这些悬浮窗 ...