Actionscript 3 AS3中具有摆动/倾斜效应的抖动对象

Actionscript 3 AS3中具有摆动/倾斜效应的抖动对象,actionscript-3,flash,effect,tween,shake,Actionscript 3,Flash,Effect,Tween,Shake,我在舞台上有一个瓶子的图像。我想让它,以便用户可以点击和拖动瓶子周围。我想让瓶子在拖动时摇摆,倾斜和旋转,就好像它被前后拉动一样。我用谷歌搜索了一下,什么也没找到。如何通过代码实现这种效果 到目前为止,我已经创建了一个计时器,它在拖动过程中跟踪起点和终点,计算行驶距离以大致了解速度和方向,然后使用Tween类在120度范围内旋转瓶子(然后反弹到0)。它离我很近,但不像我想象的那么流畅。。我觉得我需要某种自定义的缓和函数,但我对这种类型的数学不是很在行 function distanceTimer

我在舞台上有一个瓶子的图像。我想让它,以便用户可以点击和拖动瓶子周围。我想让瓶子在拖动时摇摆,倾斜和旋转,就好像它被前后拉动一样。我用谷歌搜索了一下,什么也没找到。如何通过代码实现这种效果

到目前为止,我已经创建了一个计时器,它在拖动过程中跟踪起点和终点,计算行驶距离以大致了解速度和方向,然后使用Tween类在120度范围内旋转瓶子(然后反弹到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);
}
}
函数距离timerbeat(e:TimerEvent):无效
{//速度检测节拍定时器
distCounter++;
if(!distSwitch)
{
startX=产品x;
startY=product.y;
distSwitch=true;
}
其他的
{
endX=乘积.x;
endY=product.y;
distSwitch=false;
var newDistance=calculatedInstance();
setRotation();
//轨迹('>>('+distCounter+')行驶距离='+newDistance);
//生产烟花
}   
}
函数calculateInstance():Number
{//返回在节拍计时器间隔内行驶的距离
var原始距离=((startX-endX)*(startX-endX))+((startY-endY)*(startY-endY));
var距离=数学sqrt(原始距离);
var xDistance=startX-endX;
如果(xDistance<0)
{
speedDirection=‘右’;
方向修饰符=-1;
}
否则如果(xDistance>0)
{
速度方向='左';
方向修饰符=1;
}
//跟踪('>>前进'+speedDirection+'在'+XD距离处);
返回距离;
}
函数setRotation():void
{//一旦检测到开始和结束值,检查速度并设置旋转。
var curSpeed=calculateInstance();
如果(光标速度>4)
{
tweenLock=false;
var speedPercent=curSpeed/maxSpeed*100;
变量旋转度=(速度百分比*120)/300;
var newRotation=方向修改器*旋转度;
var反向百分比=100-速度百分比;
变量tweenSpeedModifier=(速度百分比/100);
//跟踪(tweenSpeedModifier*1);
//如果(!tweenLock)
//旋转之间=零;
if(rotationTween)rotationTween.stop();
rotationTween=新的Tween(乘积,“rotation”,Strong.easeInOut,product.rotation,newRotation,0.25,true);
//恢复()之间的旋转;
添加事件列表器之间的旋转(TweenEvent.MOTION\u FINISH,resetProductTween);
//跟踪(“速度百分比=”+速度百分比);
}
其他的
{
//tweenLock=true;
}
}
函数resetProductTween(e:TweeneEvent)
{//产品旋转后,将其捕捉回原始位置。
tweenLock=false;
如果(!tweenLock)
{
rotationTween=新的Tween(产品,“旋转”,Strong.easeOut,产品.rotation,0,0.75,真);
添加事件列表之间的旋转(事件之间的运动完成,事件之间的锁定);
}
}

stage.addEventListener(MouseEvent.CLICK, calculateAngle);

var myAtan2:Number;

function calculateAngle(e:MouseEvent):void
{
    myAtan2 = Math.atan2(e.stageY - mCircle.y, e.stageX - mCircle.x);
    trace(myAtan2);
}