2014-12-17 8 views
1

무대 위에 병 이미지가 있습니다. 사용자가 병을 클릭하여 드래그 할 수 있도록하고 싶습니다. 병을 끌기 때문에 병이 흔들 리길 바라며, 병이 앞뒤로 당겨지는 것처럼 기울입니다. 나는 이것을 봤고 아무것도 발견하지 못했습니다. 코드를 통해이 효과를 얻으려면 어떻게해야합니까?AS3에서 스윙/틸트 효과가있는 떨리는 물체

드래그하는 동안 시작점과 끝점을 추적하고 속도와 방향을 대략적으로 파악하기 위해 이동 한 거리를 계산 한 다음 Tween 클래스를 사용하여 120도 범위 내에서 병을 회전합니다 그런 다음 다시 0으로 바운스합니다. 그것은 가까이 있지만 내가 원하는대로 보이는 유체로 꽤 아니에요. 나는 일종의 사용자 정의 easing 함수가 필요하지만 나는이 유형의 수학으로는 좋지 않다고 느낍니다.

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); 
} 
} 

답변