lua的缓动函数列表_兮迷风的博客-程序员秘密_lua 缓动

技术标签: lua  函数  缓动  

下面以一个完整的lua缓动函数


-- 最简单的线性变化,即匀速运动
function Linear(t,b,c,d)
    return c*t/d + b;
end
--==========================================
-- 二次方缓动
Quad = {}
function Quad.easeIn(t,b,c,d)
    t = t / d;
    return c*(t)*t + b;
end
function Quad.easeOut(t,b,c,d)
    t = t / d;
    return -c *(t)*(t-2) + b; 
end
function Quad.easeInOut(t,b,c,d)
    t = t/(d * 0.5)
    if ((t) < 1) then
        return c/2*t*t + b;
    end
    t = t - 1;
    return -c/2 * ((t)*(t-2) - 1) + b;
end

--==========================================
-- 三次方缓动
Cubic =  {}
function Cubic.easeIn(t,b,c,d)
    t = t / d
    return c*(t)*t*t + b;
end
function Cubic.easeOut(t,b,c,d)
    t = t/d - 1
    return c*((t)*t*t + 1) + b;
end
function Cubic.easeInOut(t,b,c,d)
    t = t / (d * 0.5)
    if ((t) < 1) then
        return c/2*t*t*t + b;
    end
    t = t - 2;
    return c/2*((t)*t*t + 2) + b;
end
--==========================================
-- 四次方缓动
Quart = {}
function Quart.easeIn(t,b,c,d)
    t = t / d
    return c*(t)*t*t*t + b;
end
function Quart.easeOut(t,b,c,d)
    t = t / d - 1
    return -c * ((t)*t*t*t - 1) + b;
end
function Quart.easeInOut(t,b,c,d)
    t = t / d * 0.5
    if ((t) < 1) then
        return c/2*t*t*t*t + b;
    end
    t = t - 2
    return -c/2 * ((t)*t*t*t - 2) + b;
end

--==========================================
-- 五次方缓动
Quint = {};
function Quint.easeIn(t,b,c,d)
    t = t / d
    return c*(t)*t*t*t*t + b;
end
function Quint.easeOut(t,b,c,d)
    t = t / d - 1
    return c*((t)*t*t*t*t + 1) + b;
end
function Quint.easeInOut(t,b,c,d)
    t = t / d * 0.5
    if ((t) < 1) then
        return c/2*t*t*t*t*t + b;
    end
    t = t - 2
    return c/2*((t)*t*t*t*t + 2) + b;
end

--==========================================
-- 正弦曲线缓动
Sine = {};
function Sine.easeIn(t,b,c,d)
    return -c * math.cos(t/d * (math.pi/2)) + c + b;
end
function Sine.easeOut(t,b,c,d)
    return c * math.sin(t/d * (math.pi/2)) + b;
end
function Sine.easeInOut(t,b,c,d)
    return -c/2 * (math.cos(math.pi*t/d) - 1) + b;
end

--==========================================
-- 指数曲线缓动
Expo = {}
function Expo.easeIn(t,b,c,d)
    if (t == 0) then
        return b;
    else
        return c * math.pow(2, 10 * (t/d - 1)) + b;
    end
    --return (t==0) ? b : c * math.pow(2, 10 * (t/d - 1)) + b;
end
function Expo.easeOut(t,b,c,d)
    if (t == d) then
        return b + c;
    else
        return c * (-math.pow(2, -10 * t/d) + 1) + b;
    end
    --return (t==d) ? b+c : c * (-math.pow(2, -10 * t/d) + 1) + b;
end
function Expo.easeInOut(t,b,c,d)
    if (t == 0) then 
        return b;
    end
    if (t == d) then
        return b+c;
    end
    t = t / d * 0.5;
    if ((t) < 1) then
        return c/2 * math.pow(2, 10 * (t - 1)) + b;
    end
    t = t - 1
    return c/2 * (-math.pow(2, -10 * t) + 2) + b;
end

--==========================================
-- 圆形曲线缓动
Circ = {}
function Circ.easeIn(t,b,c,d)
    t = t / d
    return -c * (math.sqrt(1 - (t)*t) - 1) + b;
end
function Circ.easeOut(t,b,c,d)
    t = t / d - 1
    return c * math.sqrt(1 - (t)*t) + b;
end
function Circ.easeInOut(t,b,c,d)
    t = t / d * 0.5
    if ((t) < 1) then
        return -c/2 * (math.sqrt(1 - t*t) - 1) + b;
    end
    t = t - 2
    return c/2 * (math.sqrt(1 - (t)*t) + 1) + b;
end

--==========================================
-- 指数衰减的正弦曲线缓动
Elastic = {}
function Elastic.easeIn(t,b,c,d,a,p)
    if (t==0) then
        return b;  
    end
    t = t / d
    if ((t)==1) then
        return b+c;  
    end
    if (not p) then
        p=d*.3;
    end
    if (not a or a < math.abs(c)) then
        a=c; 
        local s=p/4; 
    else 
        local s = p/(2*math.pi) * math.asin (c/a);
    end
    t = t - 1
    return -(a*math.pow(2,10*(t)) * math.sin((t*d-s)*(2*math.pi)/p )) + b;
end
function Elastic.easeOut(t,b,c,d,a,p)
    if (t==0) then 
        return b;  
    end
    t = t / d;
    if ((t)==1) then
        return b+c;  
    else
        if (not p) then
            p= d * 0.3;
        end
    end
    if (not a or a < math.abs(c)) then
        a=c; 
        local s=p/4; 
    else 
        local s = p/(2*math.pi) * math.asin (c/a);
    end
    return (a*math.pow(2,-10*t) * math.sin( (t*d-s)*(2*math.pi)/p ) + c + b);
end
function Elastic.easeInOut(t,b,c,d,a,p)
    if (t==0) then
        return b;
    end
    t = t / d * 0.5
    if (t == 2) then
        return b+c;  
    end
    if (not p) then
        p = d*(.3*1.5);
    end
    if (not a or a < math.abs(c)) then
         a=c; 
         local s = p / 4;
    else 
        local s = p/(2*math.pi) * math.asin (c/a);
    end
    if (t < 1) then
        t = t - 1
        return -.5*(a*math.pow(2,10*(t)) * math.sin( (t*d-s)*(2*math.pi)/p )) + b;
    end
    t = t - 1;
    return a*math.pow(2,-10*(t)) * math.sin( (t*d-s)*(2*math.pi)/p )*.5 + c + b;
end

--==========================================
-- 返回
Back = {}
function Back.easeIn(t,b,c,d,s)
    if (s == nil) then
        s = 1.70158;
    end
    t = t / d
    return c*(t)*t*((s+1)*t - s) + b;
end
function Back.easeOut(t,b,c,d,s)
    if (s == nil) then
        s = 1.70158;
    end
    t = t / d - 1
    return c*((t)*t*((s+1)*t + s) + 1) + b;
end
function Back.easeInOut(t,b,c,d,s)
    if (s == nil) then
        s = 1.70158; 
    end
    t = t / d * 0.5
    if ((t) < 1) then
        s = s * 1.525
        return c/2*(t*t*(((s)+1)*t - s)) + b;
    end
    t = t - 2
    s = s * 1.525
    return c/2*((t)*t*(((s)+1)*t + s) + 2) + b;
end


--==========================================
-- 弹跳
Bounce = {}
function Bounce.easeIn(t,b,c,d)
    return c - Bounce.easeOut(d-t, 0, c, d) + b;
end
function Bounce.easeOut(t,b,c,d)
    t = t / d
    if (t < (1/2.75)) then
        return c*(7.5625*t*t) + b;
    elseif (t < (2/2.75)) then
        t = t - 1.5/2.75
        return c*(7.5625*(t)*t + 0.75) + b;
    elseif (t < (2.5/2.75)) then
        t = t - 2.25/2.75
        return c*(7.5625*(t)*t + 0.9375) + b;
    else 
        t = t - 2.625/2.75
        return c*(7.5625*(t)*t + 0.984375) + b;
    end
end
function Bounce.easeInOut(t,b,c,d)
    if (t < d/2) then
        return Bounce.easeIn(t*2, 0, c, d) * 0.5 + b;
    else 
        return Bounce.easeOut(t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
    end
end

-- @param vars {from:,to:,update:, ease:, complete:}
function ThatTween:ToValue(obj, duration, vars)
    local tb = {obj = obj, duration = duration, from = vars["from"], to = vars["to"], vars = vars, time = 0}
    if (vars["ease"] == nil) then
        vars["ease"] = Linear;
    end
    table.insert(self.tweenlist, tb)
    return tb;
end

function ThatTween:Update(timeStep)
    local deltb = {};
    for i,v in ipairs(self.tweenlist) do
        v.time = v.time + timeStep;

        local tend = v.time >= v.duration;
        local func = v.vars["update"]; 
        if (func ~= nil) then
            local ease = v.vars["ease"];
            local val = ease(v.time, 0, 1, v.duration);
            if (tend) then
                val = 1.0;
            end

            local tval = val;
            if (v.from and v.to) then
                tval = val * (v.to - v.from) + v.from;
            end
            --print(tval);
            func(tval);
        end

        if (tend) then
            table.insert(deltb, i);
            local func = v.vars["complete"];
            if (func ~= nil) then
                func(v);
            end
        end

    end

    table.sort(deltb, function(a,b) return a > b; end);
    for i, v in ipairs(deltb) do
        table.remove(self.tweenlist, v);
    end
end
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/holmes_huang/article/details/72734781

智能推荐

关于android中postDelayed方法的讲解_留下的弥足珍贵的博客-程序员秘密_postdelayed

这是一种可以创建多线程消息的函数使用方法:1,首先创建一个Handler对象Handler handler=new Handler();&nbsp;2,然后创建一个Runnable对象Runnable runnable=new Runnable(){&nbsp;&nbsp; @Override&nbsp;&nbsp; public void run() {&nbsp;&nbsp;&nbsp...

使用Django自带的用户管理模型_余家程序员的博客-程序员秘密_导入django 自带用户‘’

1、在models.py 中导入from django.contrib.auth.models import AbstractUser2、然后创建一个用户模型类,继承AbstractUserclass User(AbstractUser): class Meta: db_table = 'db_user' verbose_name = '用户' ...

计算机上显示找不到无线网络连接失败,笔记本找不到无线网络,教您笔记本电脑搜索不到无线网络怎么办..._知擎的博客-程序员秘密

为了让用户摆脱网线连接的限制,商家们真是瞅准了这一点,才开发出了笔记本,无线网卡,无线驱动等这些玩意,而人们常常会遇到笔记本电脑无法找到无线网络适配器的问题,但是很多的用户都是束手无策,这不,小编就给大家准备了解决笔记本找不到无线网络的方法。笔记本是许多人的办公工具和娱乐工具,相比于台式电脑, 笔记本电脑的外形美观、体积小巧、携带方便、使用方便,深受人们喜爱。当然使用的用户哪有不遇一些突发的情况,...

我的世界的服务器如何制作,Minecraft我的世界如何搭建服务器做腐竹_慕容圆月的博客-程序员秘密

开始我还不知道腐竹是什么意思,后来听着听这,原来腐竹就是服主的谐音。Minecraft我的世界在国内已经有很多盒子了,只要安装好盒子就可以开房间,这样就可以和朋友连机,但是,但是如果你要做腐竹,改怎么办呢?在国内的话需要购买服务器,然后还要假设各种客户端,这一套弄下来不但劳神,而且还要Money,但是在国外,这种免费的服务是很多的,新手用来练手或者和朋友连机都可以。minecraft服务器在搜索里...

Spring Security 初识(五)--spring security 和jwt整合实现安全的resutful api_PostTruth的博客-程序员秘密

Spring Security 初识(五)–spring security 和jwt整合什么是 JWT json web token (JWT),是为了在网络环境中传递声明而设计的一种基于JSON的开放标准(RFC 7519),该token 被设计为紧凑且安全的.特别使用于分布式站点的登陆(SSO) 场景.JWT一般被用来在服务提供者和服务认证者之间传递身份信息,以便可以从服务器获取资

小迪安全视频-学习笔记(收藏)_qq_19446965的博客-程序员秘密

视频学习笔记 · 语雀https://www.yuque.com/gemaxianrenhm/hahwdw_1671465600

随便推点

Android系统自带的camera默认使用后置摄像头_1074412099的博客-程序员秘密_安卓修改默认后置摄像头

 a/packages/apps/Camera/src/com/android/camera/CameraSettings.java+++ b/packages/apps/Camera/src/com/android/camera/[email protected]@ -420,7 +420,7 @@ public class CameraSettings {     }     ...

单片机数码管动态显示时钟C语言,8位数码管显示电子时钟c51单片机程序_爱过河的小马锅的博客-程序员秘密

/*8位数码管显示 时间格式 05—50—00 标示05点50分00秒S1 用于小时加1操作S2 用于小时减1操作S3 用于分钟加1操作S4 用于分钟减1操作*/本文引用地址:http://www.eepw.com.cn/article/170901.htm#includereg52.h&gt;sbit KEY1=P3^0; //定义端口参数sbit KEY2=P3^1;sbit KEY3=P3^...

用onetab插件管理chrome的tab页,解决.crx安装时显示invalid的问题_abcddabcdd的博客-程序员秘密

chrome的tab页一旦关闭了再去翻历史记录重新打开实在麻烦,看到小众软件介绍onetab可以方便管理tab页,于是下载了试一下。在国内站点上下载了.crx文件离线安装,结果显示crx header invalid,搜索后尝试后解决方案如下:1、选择chrome-更多工具-扩展程序2、打开右上角的开发者模式,可以看到地址栏下面会出现三个按钮,第一个是“加载已解压的扩展程序”3、把下载的cr...

linux下安装phpcms文件权限不可写。_XiaoBaiduQs的博客-程序员秘密_大米cms 配置文件不可写,权限不够!

当把phpcms放入指定项目目录下等待安装,但是发现安装的第四步,文件权限设置文件的当前状态都是“不可写”,看到后自己很自觉的把文件权限改成了777 当然用的是递归修改的文件权限 (chmod 777 -R phpcms/)此处不建议全部改为777。一般情况下都会解决文件权限的问题,但是今天我这里出现了一个问题,就是没变化依旧是不可写。顿时蒙逼了,心想这也不需要重启服务啊。改完之后文件

Vue+Element-UI总结_el-checkbox实现全选功能_weixin_40877388的博客-程序员秘密_el-checkbox

一、前言 最近在做Vue+SpringBoot的项目,Vue使用了Element-UI,写几篇文章记录一下在开发过程中的小功能。 本篇讲的是使用多选框,实现全选功能。这个其实在官网上就有现成的例子,我拿来再做一个解释,避免下次使用的时候忘记。二、代码 template中的代码如下,在form表单中使用的全选功能。&lt;el-form-item label="水果(Fruits)"&gt; &lt;el-checkbox :indeterminate="isI...

结合源码分析Spark中的Accuracy(准确率), Precision(精确率), 和F1-Measure_小帆的帆的博客-程序员秘密

转载请标明出处:小帆的帆的专栏例子某大学一个系,总共100人,其中男90人,女10人,现在根据每个人的特征,预测性别Accuracy(准确率)Accuracy=预测正确的数量需要预测的总数 Accuracy = {预测正确的数量 \over 需要预测的总数} 计算由于我知道男生远多于女生,所以我完全无视特征,直接预测所有人都是男生 我预测所的人都是男生,而实际有90个男生,所以 预测正确的数量

推荐文章

热门文章

相关标签