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