AS3 - Tween到最近?

时间:2012-01-05 14:43:45

标签: actionscript-3 flex

不确定如何解释这一点,所以我先发布一些代码,然后尝试解释。解决方案应该很简单,所以我相信你们都知道我在这里尝试做什么..

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

2 个答案:

答案 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到目标帧。