这个问题烧伤了我的大脑。
我在平面上有一个对象,但为简单起见,我们仅在一个维度上进行工作,因此该对象的起始位置为xs。我知道结束位置xe。对象必须以加速(加速度= a)运动从开始位置移动到结束位置。我知道对象在结束位置(= ve)处必须具有的速度。在我的特殊情况下,结束速度为零,但是我当然需要一个通用公式。唯一未知的是起始速度与
对象在xs中以vs开始,在xe中以ve结尾,并在时间t内以加速度a沿着空间x移动。
由于我正在使用闪光灯,因此空间以像素表示,时间以帧表示(但是您可以用秒为单位进行推理,很容易就知道每秒的帧数进行转换)。
在动画循环中(以onEnterFrame为例),我用(例如a = 0.4)计算新的速度和新的位置:
vx *= a (same for vy) x += vx (same for y)
我希望整个动画持续2秒,以30 fps为60帧。现在您知道,在60帧中,我的对象必须以恒定的减速从xs移到xe,以使结束速度为0。我如何计算起始速度vs?
也许有一种更简单的方法可以在Flash中执行此操作,但是我现在对此背后的数学/物理学感兴趣。
根据DSM答案进行编辑。
我尝试应用他的建议:
var vx:Number; var a = -0.5; var xs:Number = 0; var xe:Number = Stage.width; var mc:MovieClip; var keyListener = {}; var startTime:Number; init(); function init() { mc = attachMovie("pallino", "p1", 0); mc._y = Stage.height/2; Key.addListener(keyListener); }
加速度为-0.5,起点x为0,终点x为载物台宽度。我将动画片段附加到舞台中央,然后等待按键。然后:
keyListener.onKeyDown = function() { var k = Key.getCode(); mc._x = xs; vx = 2 * (xe - xs) / 60; trace("vx:"+vx); startTime = new Date().getTime(); onEnterFrame = startAnimation; }
在按键事件中,我设置了启动速度;这里我使用60的时间,因为我的舞台设置为30 fps,并且我希望动画在2秒内发生。最后的动画是:
function startAnimation() { trace("running, vx:" + vx); mc._x += vx; vx += a; if ( mc._x >= xe ) { trace("stopping because clip is on target position"); stopAnimation(); return; } if ( vx <= 0 ) { trace("stopping because speed is too slow"); stopAnimation(); return; } } function stopAnimation() { this.onEnterFrame = null; var secsElapsed:Number = ( new Date().getTime() - startTime) / 1000; trace(secsElapsed); }
动画停止,因为在剪辑到达目标x之前速度太慢(小于零)。为什么??