Flash CS5 Перемещение объекта по кругу по 1 градусу за раз - PullRequest
1 голос
/ 02 августа 2011

У меня есть объект с именем point, который я могу перемещать по экрану с помощью мыши.Этот объект имеет вектор, отображенный через него (_v1) с использованием центра сцены и местоположения «точки» sx, y, чтобы нарисовать вектор (обратите внимание, что все это работает нормально).Моя проблема возникает, когда я настроил кнопку, которая просто устанавливает значение true, если вы нажимаете ее.Идея, лежащая в основе этой кнопки, заключается в том, что при нажатии, в какой бы точке «точка» ни находилась, она будет перемещаться на 1 градус по часовой стрелке по кругу вокруг центра сцены (все это происходит в frameHandler, поэтому я могу продолжать нажимать кнопку, чтобыэто продолжается вокруг сцены).Код, который я использую, основан на приведенном ниже операторе if:

if(clockwisePressed) {
    var v1angle:Number = _v1.angle;
    v1angle++; //increase the angle by 1 degree
    if(v1angle>180) {
        v1angle -= 360;
    }
    //Now just move the crosshair and get it ready to be redrawn
    point.x = centerX - _v1.m * Math.cos(v1angle);
    point.y = centerY - _v1.m * Math.sin(v1angle);
    clockwisePressed = false; //remove button pressed boolean
}

Так что здесь происходит то, что по часовой стрелке было установлено значение true, так что это срабатывает.Мой вектор (_v1) настроен так, чтобы сообщать мне угол (уже преобразованный из радианов в градусы), но это значение только для чтения.Поэтому я назначаю его (_v1.angle) для v1angle, чтобы я мог связываться с ним и увеличить его на 1, чтобы я двигался по часовой стрелке вокруг центра сцены.Затем я просто проверяю, чтобы убедиться, что он попадает в диапазон от -180 до 180 (если я прослеживаю _v1.angle вокруг сцены, 0 градусов слева, 90 градусов прямо вверх, 180 градусов вправо, и-90 прямо вниз).Теперь, используя формулу, полученную из этой нити , но преобразованную для работы с 0 градусами, указывающими влево, и значением Y, повышающимся по мере продвижения вниз по ступенькам, я придумал

x = centerX - radius * cos(angle)
y = centerY - radius * sin(angle)

Теперь, когда я делаю образец диаграммы на бумаге и использую эти значения на своем калькуляторе, это работает как шарм.Если я добавлю угол, радиус и центр, я получу точку прямо на своем круге и начерчу на листе миллиметровки.Однако, когда я на самом деле пытаюсь сделать это мгновенно, «точка» прыгает по всей сцене.(Обратите внимание, что _v1.m - это просто величина вектора между центром сцены и «точкой», которая равна радиусу).

Поэтому я отслеживаю все и значения cos и sin donкажется, не выходит правильно.Например, если мой угол равен -1,9581, и я вычисляю его значение в калькуляторе, я получаю что-то по линии 0,9994, но флеш-трассировка Math.cos (угол) составляет -0,3777.Разве использование Math.cos (-1.9581) - это не то же самое, что положить -1.9581 в калькулятор и нажать cos?

Так что в моем примере выше мой point.x изменился с 139.95 до 261.3.Довольно большой прыжок для того, что должно было быть 1 градус.Так что я в растерянности относительно того, что приводит к такому сбою этого кода.Я что-то здесь не так делаю?

ОБНОВЛЕНИЕ: Если кто-то, кто ищет эту тему, заинтересован, ниже приведен исправленный код, который работает:

if(clockwisePressed) {
    var v1RadAngle:Number = Math.atan2(_v1.vy, _v1.vx); //get angle in radians
    v1RadAngle += 0.0174; //increase the angle by ~1 degree more or less
    //Now just move the crosshair and get it ready to be redrawn
    point.x = centerX - _v1.m * Math.cos(v1RadAngle); //_v1.m = radius
    point.y = centerY - _v1.m * Math.sin(v1RadAngle);
    clockwisePressed = false; //remove button pressed boolean
}

1 Ответ

3 голосов
/ 02 августа 2011

Функции триггера во Flash ожидают ввода в радианах, но вы используете градусы. Вы должны преобразовать значение в градусах перед использованием:

var angle:Number = -1.9581;
var radAngle:Number = angle * Math.PI / 180;
trace(Math.cos(radAngle)); // 0.9994160815411552
...