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
:。如果确实需要三角形波,请使用近似值并将其衰减: