Flash AS3 — нажмите, перетащите и поверните — проверьте направление вращения

Я использую greensock tweenlite, чтобы щелкать, перетаскивать и вращать круговой муви-клип, и пока у меня есть следующее.

Что мне нужно сделать, так это определить направление вращения и скорость, т.е. если пользователь вращает колесо вправо, сохранить это направление в строковой переменной, а скорость вращения в числовой переменной.

Я пробовал множество разных вещей с координатами запуска и перемещения мыши, а также с координатами вращения Vinyl_mc, но не могу получить ничего надежного. Есть ли способ определить направление и скорость и сохранить их в переменных?

Приложение можно просмотреть по адресу: http://s46264.gridserver.com/dev/dave/rotate/rotate.html, а исходный файл находится по адресу: http://s46264.gridserver.com/dev/dave/rotate/rotate.fla.zip, если это вообще поможет.

Спасибо.

import com.greensock.*;
import com.greensock.easing.*;
import com.greensock.plugins.*;
import flash.events.*;

TweenPlugin.activate([ShortRotationPlugin]);
var oldRotation,ax,ay,bx,by,thetaA,thetaB,delTheta,newTheta:Number;

var direction:String;

function dragger(evt:MouseEvent)
{
    if (evt.type == MouseEvent.MOUSE_DOWN)
    {
        stage.addEventListener(MouseEvent.MOUSE_MOVE, dragger);
        stage.addEventListener(MouseEvent.MOUSE_UP, dragger);
        oldRotation = vinyl_mc.rotation;
        ax = stage.mouseX - vinyl_mc.x;
        ay = stage.mouseY - vinyl_mc.y;
        thetaA = Math.atan2(ay,ax) * 180 / Math.PI;
        if (thetaA < 0)
        {
            thetaA =  -  thetaA;
        }
        else
        {
            thetaA = 360 - thetaA;
        }

    }
    else if (evt.type == MouseEvent.MOUSE_MOVE)
    {

        bx = stage.mouseX - vinyl_mc.x;
        by = stage.mouseY - vinyl_mc.y;
        thetaB = Math.atan2(by,bx) * 180 / Math.PI;

        if (thetaB < 0)
        {
            thetaB =  -  thetaB;
        }
        else
        {
            thetaB = 360 - thetaB;
        }

        delTheta = thetaB - thetaA;
        newTheta = oldRotation - delTheta;

        TweenLite.to(vinyl_mc, 1, {shortRotation:{rotation:newTheta}, overwrite:true, ease:Cubic.easeOut});

    }
    else if (evt.type == MouseEvent.MOUSE_UP)
    {
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragger);
        stage.removeEventListener(MouseEvent.MOUSE_UP, dragger);
    }
}


vinyl_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragger);

person digitalpencil    schedule 15.03.2011    source источник


Ответы (1)


Как насчет создания маркерного объекта на краю круга, сделайте несколько триггеров, чтобы получить угол, проверьте его еще раз, сравните два. угол со временем даст вам скорость, угол1-угол2 даст вам направление.

person Sam    schedule 15.03.2011
comment
Спасибо, я использую radians = Math.atan2(vinyl_mc.mouseY, Vinyl_mc.mouseX); endAngle = ((радианы * (180/Math.PI)) + 450)% 360; который получает меня часть пути там. посмотрю выше и проверю. - person digitalpencil; 16.03.2011
comment
спасибо, это сработало. Я на самом деле закончил тем, что использовал функцию onUpdate tweenlite, чтобы записать значение временного поворота и проверить его против поворота мыши, но кросс-продукт также работает. - person digitalpencil; 17.03.2011