2012-01-05 3 views
1

Не знаете, как это объяснить, поэтому я сначала отправлю код, а затем попытаюсь объяснить. Решение должно быть простым, поэтому я уверен, что вы, ребята, знаете, что я пытаюсь сделать здесь ..AS3 - Tween ближе всего?

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

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

+0

Большое спасибо за помощь :) Он работает так, как сейчас! Еще раз спасибо за ваше время, вы оба! –

0

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

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

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

  • Start Tweening в зависимости от направления.

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

Смежные вопросы