![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2011
Сообщений: 29
|
Цитата:
round.rotation = Math.atan2(mouseY - round.y, mouseX - round.x) * 180 / Math.PI; где : Math.atan2(mouseY - round.y, mouseX - round.x) - формула вычисления угла через его тангенс. mouseY - координата курсора по Y, round.y - координата центра объекта по Y ( вместо round - имя вашего объекта или указатель и тоже самое с X ) *180 / Math.PI - перевод радианы в градусы |
|
|||||
|
Регистрация: May 2010
Адрес: пространство в положении
Сообщений: 219
|
вроде как сама ф-ция Math.atan2 уже переводит в радианы.
|
|
|||||
|
Регистрация: Aug 2011
Сообщений: 29
|
atan2(y, x) is the angle in radians between the positive x-axis of a plane and the point given by the coordinates (x, y) on it.
да, а нам для поворота нужны градусы. |
|
|||||
|
[+1 03.01.12]
[++1 03.01.12] Регистрация: Dec 2011
Сообщений: 29
|
import flash.events.MouseEvent; stage.addEventListener(MouseEvent.MOUSE_MOVE, rotations); function rotations (e:MouseEvent):void { fonar_mc.rotation = Math.atan2(mouseY - fonar_mc.y, mouseX - fonar_mc.x)* 180 / Math.PI; } не пойму почему так ( как сделать чтоб этот фонарь указывал ровно на курсор мыши |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Knob.as
package { import flash.display.GradientType; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BevelFilter; import flash.filters.DropShadowFilter; import flash.geom.Matrix; import flash.geom.Point; public class Knob extends Sprite { private const RAD:Number = Math.PI / 180; private var _knob:Sprite; private var _knobAngleLast:Number = 0; private var _handAngleStart:Number; public function Knob() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); //// Шкала 25 рисок var scal:Shape = new Shape(); var sg:Graphics = scal.graphics; sg.lineStyle(2, 0x666666); for (var s:uint = 0; s < 250; s += 10) { var angle:Number = (150 + s) * RAD var sp:Point = Point.polar(60, angle); var sp2:Point = Point.polar(s % 20 ? 65 : 70, angle); sg.moveTo(sp.x, sp.y); sg.lineTo(sp2.x, sp2.y); } addChild(scal); //// Ручка _knob = new Sprite(); addChild(_knob); var g:Graphics = _knob.graphics; g.beginFill(0x000000); for (var i:uint = 0; i < 360; i += 30) { var p:Point = Point.polar(45, i * RAD); g.drawCircle(p.x, p.y, 10); } g.beginFill(0x000000); g.drawCircle(0, 0, 50); var matrix:Matrix = new Matrix(); matrix.createGradientBox(94, 94, 0, -47, -47); g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x101010], [1, 1], [210, 255], matrix); g.drawCircle(0, 0, 48); //// Риска на ручке, под 150 град для простоты расчета ограничения вращения var p1:Point = Point.polar(20, 150 * RAD); var p2:Point = Point.polar(45, 150 * RAD); g.endFill(); g.lineStyle(3, 0x333333); g.moveTo(p1.x, p1.y) g.lineTo(p2.x, p2.y); _knob.filters = [ new BevelFilter(25, 60, 0xFFFFFF, 0.5, 0x000000, 0.5, 25, 25, 0.5, 3), new DropShadowFilter(10, 60, 0x000000, 0.5, 12, 12, 1, 3) ]; _knob.addEventListener(MouseEvent.MOUSE_DOWN, handlerDown); } private function handlerDown(event:MouseEvent):void { _knobAngleLast = _knob.rotation; _handAngleStart = Math.atan2(mouseY, mouseX) / RAD; stage.addEventListener(MouseEvent.MOUSE_MOVE, handlerMove); stage.addEventListener(MouseEvent.MOUSE_UP, handlerUp); } private function handlerUp(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, handlerMove); stage.removeEventListener(MouseEvent.MOUSE_UP, handlerUp); } private function handlerMove(event:MouseEvent):void { var handAngle:Number = Math.atan2(mouseY, mouseX) / RAD; var delta:Number = _handAngleStart - handAngle; _handAngleStart = handAngle; _knob.rotation -= delta; if (_knob.rotation < 0 && _knob.rotation > -(360 - 240) ) { _knob.rotation = _knobAngleLast; } else { _knobAngleLast = _knob.rotation; } } } } package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point this.graphics.beginFill(0x444444); this.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); var knob:Knob = new Knob(); addChild(knob); knob.x = knob.y = 200; } } }
__________________
Reality.getBounds(this); |
|
|||||
|
[+1 03.01.12]
[++1 03.01.12] Регистрация: Dec 2011
Сообщений: 29
|
сори я только начал учить as по сему если мона то четкое описание к этому всему кода много а что он делает понятно но смутно )
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
"кода много" только рисует. Что можно подробно описать про 10 строчек? Выше все уже описали.
И да, это был ответ (запозднившийся) топикстартеру, не Вам. Просто чтобы был уже реальный рабочий пример "не прыгающего на мышку" drag rotation.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:54. |
|
|
« Предыдущая тема | Следующая тема » |
|
|