我需要这样的功能。水平值是时间,垂直是输出。从时间开始0
,值应该是-1
或1
。增加时间量,该值应该达到1
和-1
,每次“反弹”时减少距离。
过去我用 hackish 代码完成了它:将目标值存储在变量中,每次值达到目标值时,我都会这样做targetValue *= -.5
,依此类推。
也许有一个更好的实现,使用不需要手动执行此操作的数学函数。对我来说,它就像一个三角函数,但最终输出乘以1 - (time / maxTime)
,它不是波而是线。
我需要这样的功能。水平值是时间,垂直是输出。从时间开始0
,值应该是-1
或1
。增加时间量,该值应该达到1
和-1
,每次“反弹”时减少距离。
过去我用 hackish 代码完成了它:将目标值存储在变量中,每次值达到目标值时,我都会这样做targetValue *= -.5
,依此类推。
也许有一个更好的实现,使用不需要手动执行此操作的数学函数。对我来说,它就像一个三角函数,但最终输出乘以1 - (time / maxTime)
,它不是波而是线。
如果您对确切的形状不感兴趣,那么targetValue *= -.5
这正是我会做的,只要调用绘制图形的函数之间的时间增量相等。我认为这是一个不错的选择的原因是它是最简单的选择,可以满足您的需求。如果时间增量不相等,您可能希望得到与 -(time-Increment) 成比例的东西,而不是总是 -.5。
如果“目标值”的减少是线性的,如图所示,那么:
有更简洁的方法来编写代码,但这里有一个清晰的版本。它是用 SAS OPTMODEL 代码编写的,但如果您无法访问 OPTMODEL,您应该能够轻松地将其翻译成任何语言:
proc optmodel;
num targetValue init -1;
num n init 3;
num series{ t in 1 .. 2*n + 1} =
if t = 1 then
targetValue
else
-series[t - 1] + mod(t,2)* (1 / n);
print series;
quit;
如果您使用常数乘积而不是常数减法,则您的系列将仅在极限内达到 0。
由于这是为了游戏的闪烁效果(因此被击中的角色开始缓慢闪烁,然后闪烁得更快),我最终根据@Blender 的答案制作了一个解决方案。
唯一不同的是,除了让垂直弹跳间距变小外,它还让水平弹跳间距变小。
AS3中的代码是:
// flickerTime is a Number between 0 and max, in seconds.
// max is the amount in seconds that the flickering effect lasts
// 10 is a constant that can be changed if we want more or less flickers in that amount of time
var max:Number = 3;
var flick:Number = Math.cos(this.flickerTime * this.flickerTime * 10) * (max - this.flickerTime) / max;
this.visible = flick > 0;