AS3 - Твин к ближайшему? - PullRequest
1 голос
/ 05 января 2012

Не знаю, как это объяснить, поэтому сначала я опубликую некоторый код, а затем попытаюсь объяснить. Однако решение должно быть простым, поэтому я уверен, что вы, ребята, знаете, что я пытаюсь сделать здесь ..

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 голосов
/ 05 января 2012

Итак, вы хотите сделать что-то вроде следующего?

  • Определите, в каком направлении идти

(непроверенный код) if ((Math.abs (currentFrame - targetFrame)> (total frames / 2)) // Затем вернемся назад. (здесь может быть больше логики, я пропускаю, но это общая идея)

  • Начало анимации в зависимости от направления.

Если вы собираетесь пересечь 0, я бы порекомендовал иметь цепочку анимации, сначала от текущего значения до нуля, а затем от 359 до целевого кадра.

0 голосов
/ 05 января 2012

Вот одно из решений, хотя я не уверен, что оно лучшее. Я только слегка протестировал это с помощью 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 новое растровое изображение создается путем выбора либо значения, которое является определенным числом от конца буфера, либо использования модуля для обеспечения пересчета значений, превышающих длину буфера.

...