2014-12-17 2 views
1

У меня есть изображение бутылки на сцене. Я хочу иметь его так, чтобы пользователь мог щелкнуть и перетащить бутылку вокруг. Я хочу, чтобы бутылка колебалась, так как она тащилась так наклона и вращается, как будто ее тянут вперед и назад. Я искал это и ничего не нашел. Как я могу достичь этого эффекта с помощью кода?Shaking Object With Swinging/Tilting Effect в AS3

До сих пор я создал таймер, который отслеживает начальную и конечную точку во время перетаскивания, вычисляет пройденное расстояние, чтобы получить приблизительное представление о скорости и направлении, а затем вращает бутылку в диапазоне 120 градусов с использованием класса Tween (а затем вернуться к 0 после). Это близко, но не совсем так, как жидкость выглядит так, как хотелось бы. Я чувствую, что мне нужна какая-то пользовательская функция ослабления, но я не очень хорош в этом типе математики.

function distanceTimerBeat(e:TimerEvent):void 
{//speed detection beat timer 
distCounter++; 
if(!distSwitch) 
{ 
    startX = product.x; 
    startY = product.y; 
    distSwitch = true; 
} 
else 
{ 
    endX = product.x; 
    endY = product.y; 
    distSwitch = false; 
    var newDistance = calculateDistance(); 
    setRotation(); 
    //trace('>> ('+distCounter+') distance travelled = '+newDistance); 
    //produceNewFirework() 
    } 
} 

function calculateDistance():Number 
{//returns distance travelled over beat timer intervals 

var rawDistance = ((startX - endX) * (startX - endX)) + ((startY - endY) * (startY - endY)); 
var distance = Math.sqrt(rawDistance); 
var xDistance = startX - endX; 
if(xDistance < 0) 
{ 
    speedDirection = 'right'; 
    directionModifier = -1; 
} 
else if(xDistance > 0) 
{ 
    speedDirection = 'left'; 
    directionModifier = 1; 
} 

//trace('>> going '+speedDirection+' at '+xDistance); 
return distance; 
} 

function setRotation():void 
{ //once start & end values are detected, check speed and set the rotation. 

var curSpeed = calculateDistance(); 

if(curSpeed > 4) 
{ 
    tweenLock = false; 


    var speedPercent = curSpeed/maxSpeed * 100; 

    var rotationDegree = (speedPercent*120)/300; 
    var newRotation = directionModifier*rotationDegree; 


    var reversePercent = 100 - speedPercent; 
    var tweenSpeedModifier = (speedPercent/100); 
    //trace(tweenSpeedModifier*1); 

    //if(!tweenLock) 
     //rotationTween = null; 

     if(rotationTween) rotationTween.stop(); 
     rotationTween = new Tween(product, "rotation", Strong.easeInOut, product.rotation, newRotation, 0.25, true); 
     //rotationTween.resume(); 
     rotationTween.addEventListener(TweenEvent.MOTION_FINISH, resetProductTween); 
     //trace('speed percet = '+speedPercent); 

} 
else 
{ 
    //tweenLock = true; 
} 
} 

function resetProductTween(e:TweenEvent) 
{//after the product rotates, snap it back to it's original position. 
tweenLock = false; 
if(!tweenLock) 
{ 
    rotationTween = new Tween(product, "rotation", Strong.easeOut, product.rotation, 0, 0.75, true); 
    rotationTween.addEventListener(TweenEvent.MOTION_FINISH, tweenUnlock); 
} 
} 

ответ