我希望对象具有线性的易用性,而对于同一点则可以轻松返回。 我还希望持续时间或补间速度是相同的,直到对象到达该点,但然后返回缓动仍然有时间传递目标并返回。
是否有一些公式可以计算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}
在这个示例中,后退对象看起来运行得更快,因为在持续时间内会计算后退容易度,并且我希望它能够使用相同的值。
答案 0 :(得分:0)
如果我说得对,你希望它看起来像这样(每个箭头代表一个补间的滴答声):
Linear: → → → → → →|
Back: → → → → → → → →
|← ←
使用Back缓动的补间显然需要比Linear补间更多的时间。
而且,你将无法同步它们(速度会有所不同),因为Back缓动会立即加速,而线性缓动是单调的。请参阅常见缓和类型的任何图表。这些在这里,例如:http://easings.net/
所以,你需要做的是使用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
秒的每帧分配坐标。