实现缓动函数
我正在尝试移植并实现我发现的缓动功能
编辑
:我粘贴了错误的缓动功能,抱歉!这是正确的:
Math.easeOutQuart = function (t, b, c, d) {
t /= d;
t--;
return -c * (t*t*t*t - 1) + b;
};
我使用的语言不是 Flash 或 Actionscript。这是我的代码:
ease:{outquart:{function(t as float,b as float,c as float,d as float) as float
t=t/d
t=t-1
return -c * (t*t*t*t - 1) + b
end function}}
我正在循环中调用该函数:
EDIT2 - 调用函数。
m.move 设置为 1 或 -1 表示移动方向,或 -5 +5 表示移动 5 个长度。 setspritemoves 被尽可能频繁地调用,目前它与系统调用的速度一样快,但我可以在毫秒计时器上触发调用。
setspritemoves:function()
if m.move=1 then
m.duration=1
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*224
next i
end if
else if m.move=5 then
m.duration=5
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*224
next i
end if
else if m.move=-1 then
m.duration=1
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*224
next i
end if
else if m.move=-5 then
m.duration=5
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*224
next i
end if
end if
end function
m.moveto[i] 是目标 x 坐标,m.time 是整数 I 增量,m.duration 是我假设的完成更改所需的时间,m.spriteposx 是当前位置我正在移动的物体。 [i] 是当前精灵。
如果我想在 1/2 秒内移动 345 个像素,时间的增量值应该是多少,持续时间应该是多少?
在我所有的实验中,我要么超出了很大的因素,要么只移动了几个像素。
目前,m.time 每次迭代都会增加 1,m.duration 为 100。我尝试了各种值,但似乎没有一个能始终如一地工作。
I'm trying to port and implement an easing function I found
EDIT
: I pasted in the wrong easing function, Sorry! Here is the correct one:
Math.easeOutQuart = function (t, b, c, d) {
t /= d;
t--;
return -c * (t*t*t*t - 1) + b;
};
The language i'm using is not Flash or Actionscript. Here is my code:
ease:{outquart:{function(t as float,b as float,c as float,d as float) as float
t=t/d
t=t-1
return -c * (t*t*t*t - 1) + b
end function}}
I'm calling the function in a loop with:
EDIT2 - the calling function.
m.move is set to 1 or -1 for direction to move, or -5 +5 to move by 5 lengths.
setspritemoves is called as often as possible, currently it is as fast as the system can call, but I could trigger the call on a millisecond timer.
setspritemoves:function()
if m.move=1 then
m.duration=1
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*224
next i
end if
else if m.move=5 then
m.duration=5
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]+m.move*224
next i
end if
else if m.move=-1 then
m.duration=1
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*224
next i
end if
else if m.move=-5 then
m.duration=5
if m.ishd then
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*324
next i
else
for i=0 to m.spriteposx.count()-1
m.moveto[i]=m.spriteposx[i]-m.move*224
next i
end if
end if
end function
m.moveto[i] is the destination x coordinate, m.time is an integer I increment, m.duration is what I assume to be the amount of time I want the change to take to complete, m.spriteposx is the current position of the object I'm moving. [i] is the current sprite.
What should the increment value be for time what should the duration be, if I want to move 345 pixels in 1/2 second?
In all my experiments, I either overshoot by a huge factor, or only move a few pixels.
currently m.time is incremented by 1 every iteration, and m.duration is 100. I"ve tried all kinds of values and none seems to work consistently.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
为什么你没有复制 1-1 的逻辑?补间是一个简单的算法,它只是以四次方式将坐标从
b
映射到b+c
,即b + c*t^4< /code> 其中
t
获取区间[0,1]
中的值。通过替换可以看出,当t=0
时,该值为初始值b
,当t->1
时,位置为所需的b+c
。这就是
t \= d
行的原因,因此d
是任意持续时间,而t
是自动画开始以来经过的时间得到上述范围内的值。但你已经完成了t=t-1
并拍摄了底片等。为什么?例如,在 0.5 秒内移动 345px,假设 px 是测量单位,您将有一个初始位置
b
和c=345
。d=0.5
并且您将动画分割为您选择的长度间隔(取决于运行动画的机器的功率。移动设备不如台式机强大,因此您选择在这种情况下合理的帧率)。假设我们选择 24 fps,因此我们将间隔分割为0.5*24 = 12
帧,并每 1/24th 秒调用一次该函数,每次其中t
取值 1/24、2/24 等。如果不是以秒为单位而是以帧为单位工作更舒服,则d=12
和t
取值 1,2,...,12。无论哪种方式,计算都是相同的。这是一个很好的示例(单击该框来运行演示),请随意修改这些值:
http://jsfiddle。净/nKhxw/
Why haven't you copied the logic across 1-1? The tween is a simple algorithm, it simply maps co-ordinates from
b
tob+c
in a quartic fashion, i.e.b + c*t^4
wheret
gets values in the interval[0,1]
. You can see by substitution that whent=0
the value is the initial value,b
, and ast->1
the position is the requiredb+c
.That's the reason for the line
t \= d
, sod
is an arbitrary duration andt
, the time passed since the beginning of the animation gets a value in the aforementioned range. But you've donet=t-1
and taken negatives, etc. Why?For example, moving 345px in 0.5s, you would have an initial position,
b
andc=345
assuming px is the units of measure.d=0.5
and you split the animation into intervals of a length of your choosing (depending on the power of the machine that will run the animation. Mobile devices aren't as powerful as desktops, so you choose a reasonable framerate under the circumstances). Let's say we choose 24 fps, so we split the interval into0.5*24 = 12
frames, and call the function once every 1/24th of a second, each time witht
taking values of 1/24, 2/24, etc. If it's more comfortable to work not in seconds but in frames, thend=12
andt
takes values 1,2,...,12. The calculations are the same either way.Here's a nice example (click the box to run the demo), feel free to fiddle with the values:
http://jsfiddle.net/nKhxw/
贝塞尔函数
借自 http: //blog.greweb.fr/2012/02/bezier-curve-based-easing-functions-from-concept-to-implementation/
常见曲线的别名:
应该是轻松制作自己的曲线...
Bezier functions
Borrowed from http://blog.greweb.fr/2012/02/bezier-curve-based-easing-functions-from-concept-to-implementation/
Aliases for common curves:
Should be easy to make your own curves...
谢谢你,乔尼!
以下是如何实现 Bezier 缓动函数:C 或 Objective-C for iOS
Thank you, Jonny!
Here is how to implement Bezier easing functions: C or Objective-C for iOS