Math 乒乓球值随着时间的推移而减少,以产生闪烁效果

Math 乒乓球值随着时间的推移而减少,以产生闪烁效果,math,language-agnostic,trigonometry,game-development,Math,Language Agnostic,Trigonometry,Game Development,我需要这样一个函数。水平值是时间,垂直值是输出。从时间0开始,值应为-1或1。随着时间的增加,该值应变为1和-1,并减少每次“反弹”的距离 我以前用黑客代码做过:将目标值存储在变量中,每次值达到目标值时,我都执行targetValue*=-.5,依此类推 也许有一个更好的实现,使用数学函数,不需要手工操作。对我来说,它就像一个三角函数,但最终输出乘以1-(time/maxTime),它不是波而是线。如果你对确切的形状不感兴趣,那么targetValue*=-.5正是我要做的,只要绘制图形的函数调

我需要这样一个函数。水平值是时间,垂直值是输出。从时间
0
开始,值应为
-1
1
。随着时间的增加,该值应变为
1
-1
,并减少每次“反弹”的距离

我以前用黑客代码做过:将目标值存储在变量中,每次值达到目标值时,我都执行
targetValue*=-.5
,依此类推


也许有一个更好的实现,使用数学函数,不需要手工操作。对我来说,它就像一个三角函数,但最终输出乘以
1-(time/maxTime)
,它不是波而是线。

如果你对确切的形状不感兴趣,那么
targetValue*=-.5
正是我要做的,只要绘制图形的函数调用之间的时间增量相等。我认为这是一个很好的选择,因为这是一个最简单的选择,可以满足你的需求。如果时间增量不相等,您可能希望得到与-(时间增量)成比例的值,而不是始终为-.5。

如果“目标值”的减少是线性的,如图所示,则:

  • 将时间步长标准化为1,并将标准化时段数设置为n
  • 从targetValue=-1开始
  • 有更简洁的方法来编写代码,但这里有一个清晰的版本。它是用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 answer制定了一个解决方案

唯一的区别是,除了使垂直反弹间隔变小之外,它还使水平反弹间隔变小

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;

我能想到的最接近的函数是
-cos(n*x)*(max-x)/max
:。如果确实需要三角形波,请使用近似值并将其衰减: