使补间速度对齐线性和立方体

时间:2014-07-15 11:19:41

标签: actionscript-3 greensock

我希望对象具有线性的易用性,而对于同一点则可以轻松返回。 我还希望持续时间或补间速度是相同的,直到对象到达该点,但然后返回缓动仍然有时间传递目标并返回。

是否有一些公式可以计算Back easy的持续时间以匹配线性缓动的速度?

例如:

 var easeParams:array = [2];
 var duration:Number = 1;

 TweenLite.to(normalObject,duration,{y:30,ease:Linear.easeOut});
 TweenLite.to(backObject,duration,{y:30,ease:Back.easeOut,easeParams:easeParams}

在这个示例中,后退对象看起来运行得更快,因为在持续时间内会计算后退容易度,并且我希望它能够使用相同的值。

1 个答案:

答案 0 :(得分:0)

如果我说得对,你希望它看起来像这样(每个箭头代表一个补间的滴答声):

Linear: → → → → → →|

Back:   → → → → → → → →
                   |← ←

使用Back缓动的补间显然需要比Linear补间更多的时间。

而且,你将无法同步它们(速度会有所不同),因为Back缓动会立即加速,而线性缓动是单调的。请参阅常见缓和类型的任何图表。这些在这里,例如:http://easings.net/

enter image description here

所以,你需要做的是使用Back tween而不是过冲而不是Linear,或者在backObject移动的第一部分中使用Linear而不是Back,并在线性部分完成后使用单独的补间来超调

<强>更新

以下是如何使两个补间同时达到目标值。 但速度并不相同。

import flash.display.Sprite;
import com.greensock.TweenLite
import com.greensock.data.TweenLiteVars;
import com.greensock.easing.Linear;
import com.greensock.easing.Back;

// *** actual solution ***
var overshoot:Number = 3; // amount of overshoot for Back easing
var durationBack:Number = 3;
// the formula to make both tweens reach target value simultaneously
var durationLinear:Number = durationBack/(overshoot+1); 

// test sprites

var linearSprite:Sprite = new Sprite();
linearSprite.graphics.lineStyle(20, 0xFF);
linearSprite.graphics.lineTo(1,0);
linearSprite.x = 50;
linearSprite.y = 50;
this.addChild(linearSprite);

var backSprite:Sprite = new Sprite();
backSprite.graphics.lineStyle(20, 0xFF00);
backSprite.graphics.lineTo(1,0);
backSprite.x = 50;
backSprite.y = 80;
this.addChild(backSprite);

// tweening

var linearParams:TweenLiteVars = new TweenLiteVars();
linearParams.ease(Linear.easeOut);
linearParams.prop("x", 300);
var linearTween:TweenLite = new TweenLite(linearSprite, durationLinear, linearParams);

var backParams:TweenLiteVars = new TweenLiteVars();
backParams.ease(Back.easeOut, [overshoot]);
backParams.prop("x", 300);
var backTween:TweenLite = new TweenLite(backSprite, durationBack, backParams);

所以,我要做的是让两个精灵以相同的方式移动,启动一个Back补间并移动另一个精灵,只需按照上面计算的每durationLinear秒的每帧分配坐标。