不确定如何解释这一点,所以我先发布一些代码,然后尝试解释。解决方案应该很简单,所以我相信你们都知道我在这里尝试做什么..
public function tweenUpdate():void{
if (_currentFrame>=358) _currentFrame -= 359;
if (_currentFrame<0) _currentFrame += 359;
var myBitmap:Bitmap = new Bitmap(buffer[_currentFrame+1]);
myBitmap.smoothing = true;
imageBuffer.data = myBitmap;
}
这就是触发它的原因:
TweenLite.to(this, 2, {_currentFrame: 50, ease:Strong.easeOut, onUpdate:tweenUpdate, onComplete:tweenComplete});
所以,我有360张图片(但是我使用_currentFrame来确定要显示的图片。所以我们将看看_currentImage:int)。
我想从当前帧补充我的目标帧。这就是我的代码现在所做的(感谢迄今为止帮助我的shanethehat)。
但是,我想在最短的路上补间!
实施例: 我在第10帧,我想去第350帧。 我不想从10-350(跳过340帧)转而去,从10到350(跳到第0帧并继续从359跳到350)。
我希望你能得到我在这里想说的话:P
答案 0 :(得分:0)
这是一个解决方案,虽然我不确定它是最好的解决方案。我只使用100帧MovieClip轻轻测试了这一点,所以我希望它适用于你的缓冲区设置。
import com.greensock.TweenLite;
import com.greensock.easing.Strong;
var _currentFrame:int = 1;
function tweenTo($target:int):void
{
if(_currentFrame - $target > buffer.length - _currentFrame + $target) {
//quicker to loop from buffer.length to 0
_currentFrame = $target - (buffer.length - _currentFrame + $target);
} else if (buffer.length - $target + _currentFrame < $target - _currentFrame) {
//quicker to loop from 0 to buffer.length
_currentFrame = $target + (buffer.length - $target + _currentFrame);
}
TweenLite.to(this,2,{_currentFrame:$target,ease:Strong.easeOut,onUpdate:tweenUpdate});
}
function tweenUpdate():void
{
var myBitmap:Bitmap;
if(_currentFrame < 1) {
myBitmap = new Bitmap(buffer[buffer.length + _currentFrame]); //_currentFrame is negative
} else {
myBitmap = new Bitmap(buffer[_currentFrame % buffer.length]);
}
myBitmap.smoothing = true;
imageBuffer.data = myBitmap;
}
每次调用tweenTo
方法启动补间。这通过在起点和终点之间跳转来检查是否存在到目标的较短路线,而不是仅仅像补间那样自然地移动。如果它会更快,那么_currentFrame
的初始值就会改变。
在tweenUpdate
方法中,通过从缓冲区末尾选择一个特定数字的值来创建新位图,或者使用模数来确保重新计算高于缓冲区长度的值。
答案 1 :(得分:0)
那么你想做类似以下的事情吗?
(未经测试的代码)if((Math.abs(currentFrame - targetFrame)&gt;(总帧数/ 2))//然后反向。 (这里可能有更多的逻辑我忽略了,但这是一般的想法)
如果您要越过0,我建议使用补间链,首先从当前值到零,然后从359到目标帧。