Облегчить вращение и положение MovieClip для мыши, математическая помощь - PullRequest
1 голос
/ 25 июня 2010

По сути, я пытаюсь сделать то же самое, что и это: http://www.senocular.com/flash/source/?id=0.16

Однако я бы хотел ослабить / изменить положение фрагмента ролика и повернуть его в положение мыши.

Основная проблема, которую я вижу, - попытаться получить текущее вращение мувиклипа и вращение цели, а затем повернуть его по кругу или против часовой стрелки от текущего к цели. То, как вращение мувиклипа использует положительные и отрицательные числа, отбрасывает его. Если вы просто хотите привязать вращение mc к вращению мыши, это нормально, но как только вы попытаетесь настроить его, вы столкнетесь с трудностями.

Таким образом, конечный эффект был бы таким, как если бы вы рисовали воображаемые круги по часовой стрелке вокруг объекта, он должен просто вращаться по часовой стрелке в направлении мыши. Затем, если вы начали идти против часовой стрелки, он должен просто ослаблять против мыши против часовой стрелки.

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 26 июня 2010

Итак, есть две части. Во-первых, вы хотите найти кратчайший угол между двумя углами. Во-вторых, вам нужно облегчить между углами и положением.

Нахождение кратчайшего угла.

angleDelta будет кратчайшим углом поворота между вашими двумя углами.

var angleDiff:Number = angleTo - currentAngle;
var angleDelta:Number = Math.atan2(Math.sin(angleDiff), Math.cos(angleDiff));
angleDelta *= (180/Math.PI); // Change angle from Radians to Degrees.

Простота между значениями

Я обычно использую простое уравнение в каком-то цикле (обычно enterFrame) для упрощения между простыми значениями.

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
private function enterFrameHandler(e:Event):void 
{
    rotation += (targetRotation - currentRotation) * 0.2;
    x += (targetX - currentX) * 0.4;
    y += (targetY - currentY) * 0.4;
}

EDIT *

Это должно сработать для вас.

const TO_DEGREES:Number = 180 / Math.PI;
const TO_RADIANS:Number = Math.PI / 180;

addEventListener(Event.ENTER_FRAME, enterFrameHandler);

function enterFrameHandler(e:Event):void
{
    var angleTo:Number = Math.atan2(stage.mouseY - y, stage.mouseX - x) * TO_DEGREES;
    if (angleTo > rotation+180) angleTo -= 360;
    if (angleTo < rotation-180) angleTo += 360;

    rotation += (angleTo - rotation) * 0.2;
    x += (stage.mouseX - x) * 0.2;
    y += (stage.mouseY - y) * 0.2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...