PDA

Просмотр полной версии : Поворот объекта мышкой без рывка


scorp2007
08.04.2013, 20:26
Добрый день всем.
Есть проблема, нужно поворачивать объект мышкой (зажал мышь - повернул объект ей, отпустил мышь), проблема в том я использую сейчас такой метод:


var dy:Number = mouseY - menum.k1.y;
var dx:Number = mouseX - menum.k1.x;
var radians:Number = Math.atan2(dy, dx);
var degrees:Number = radians / (Math.PI / 180);
menum.k1.rotation = degrees;


Но собственно проблема в том что мне нужно вне зависимости от того где нажата мышь - от туда и поворачивать объект, чтобы не было рывка на угол относительно мыши. Сложно объяснить, вот нарисовал схему - сверху так как щас происходит, снизу как хотелось бы. КЛИК - нажатие мыши, UP DOWN - мышь отпустили.
Целый день что-то голову ломаю, не могу решить данную задачу, спасибо заранее.

Wolsh
08.04.2013, 21:02
http://flasher.ru/forum/showthread.php?t=177781

chamele0n
08.04.2013, 21:17
навскидку

menum.k1.rotation += degrees;

scorp2007
08.04.2013, 21:45
Wolsh - спасибо, это то что нужно, но можно ли показать как сделать так чтобы не было ограничения, а этот "регулятор" прокручивался по кругу в обе стороны?

Wolsh
08.04.2013, 21:53
Там же выложен файл dj.zip
dj.swf

scorp2007
09.04.2013, 12:16
Wolsh, да, спасибо, не заметил. В примере все хорошо работает, но почему-то когда я переношу код в свой проект, оно крутится не так как надо, а именно угол четко не привязывается к мыши и я могу прокрутить полэкрана а объект прокрутится немного лишь, будто мне надо 2-3 круга сделать мышью вокруг объекта чтоб он на 360 градусов прокрутился. В чем тут может быть дело? Может положение мыши должно считаться не отностельно Stage? Вот код:


public const RAD:Number = Math.PI / 180;
public var _knobAngleLast:Number = 0;
public var _handAngleStart:Number;

menum.k1.addEventListener(MouseEvent.MOUSE_DOWN, k1down);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseUp);



public function k1down(e:MouseEvent):void
{
k1int = 1;
//
_knobAngleLast = menum.k1.rotation;
_handAngleStart = Math.atan2(mouseY, mouseX) / RAD;
}

public function mouseUp(e:MouseEvent):void
{
if (k1int == 1)
{
k1int = 2;
}
}


И в функции Update повесил такое:


if (k1int == 1)
{
var handAngle:Number = Math.atan2(mouseY, mouseX) / RAD;
var delta:Number = _handAngleStart - handAngle;
_handAngleStart = handAngle;
menum.k1.rotation -= delta;
}


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

Wolsh
09.04.2013, 13:32
29369
Синий — тот угол, что считаете Вы.
Красный — тот, который нужно считать.
Пройденное мышкой расстояние одно и то же, а углы совершенно разные))) Вот и наматываете 4 раза по 30, чтобы получить те же 120.

scorp2007
09.04.2013, 14:55
Благодарю, очень помогли.

Заменил:

mouseY, mouseX


На:

mouseY-menum.k1.y, mouseX-menum.k1.x


И всё заработало как надо. Еще раз спасибо :)