![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2009
Сообщений: 43
|
В общем создавал уже тему о том как поворачивать объект относительно его центра мышью, мне дали пару советов, которые я объединил и создал нечто:
private var moving:Boolean = false; private var deltaAngle:Number; //стартовая разница между углом поворота объекта и мышью private function rotateObject():void { if(moving) // того чтобы при первом клике объект сразу не прыгал на угол под которым висит мышь { var newDelta:Number = Math.atan2(this.mouseY - layout_mc.y, this.mouseX - layout_mc.x) - layout_mc.rotation; //разница между углом поворота объекта и мышью if(deltaAngle < newDelta) { layout_mc.rotation += Math.abs(newDelta - deltaAngle); } else { if(deltaAngle > newDelta) { layout_mc.rotation -= Math.abs(newDelta - deltaAngle); } } } else { deltaAngle = Math.atan2(this.mouseY - layout_mc.y, this.mouseX - layout_mc.x) - layout_mc.rotation; moving = true; } } и второй, второстепенный вопрос, как отключить залипание мыши, например я нажал на объект, увел с него мышь, отжал, но объект думает что мышь все еще нажата, как это пофиксить? вот пример с кодом который я привел: http://zakatnov.ru/trash/circle.rar |
|
|||||
|
Регистрация: Feb 2010
Сообщений: 33
|
У вас код излишне сложный, например вот этот кусок:
var newDelta:Number = Math.atan2(this.mouseY - layout_mc.y, this.mouseX - layout_mc.x) - layout_mc.rotation; //разница между углом поворота объекта и мышью if(deltaAngle < newDelta) { layout_mc.rotation += Math.abs(newDelta - deltaAngle); } else { if(deltaAngle > newDelta) { layout_mc.rotation -= Math.abs(newDelta - deltaAngle); } } |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 43
|
Объект ведет себя также, может и правда я много на *****кодил, просто уже сил нет, месяц с этим маюсь, а гугл адекватных решений не дает, нашел один более менее нормальный пример, но там все на AS2, и со своей спецификой. Не знаю, у меня архив качается
|
|
|||||
|
Вот простой пример, написанный на коленке, где все работает как надо:
package { import flash.display.DisplayObject; import flash.display.MovieClip; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; [SWF(width=640,height=480,backgroundColor=0xffffff,frameRate=60)] public class Main extends Sprite { private var _x:Number = 100; private var _y:Number = 100; private var _angle:Number = 0; private var _container:Sprite; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { if (hasEventListener(Event.ADDED_TO_STAGE)) removeEventListener(Event.ADDED_TO_STAGE, init); var s:Shape = new Shape(); s.graphics.lineStyle(2, 0x990000); s.graphics.drawCircle(20, 20, 20); s.graphics.moveTo(20, 20); s.graphics.lineTo(40, 20); s.x = (-s.width / 2) + 1; s.y = (-s.height / 2) + 1; _container = new Sprite(); _container.addChild(s); _container.x = _x; _container.y = _y; addChild(_container); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove); } private function mouseMove(e:MouseEvent):void { var xl:Number = e.stageX - _container.x; var yl:Number = e.stageY - _container.y; _angle = (Math.atan2(yl, xl)) * (180 / Math.PI); _container.rotation = _angle; e.updateAfterEvent(); } } } |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 43
|
Это все конечно хорошо, но мне надо чтобы при клике по объекту он не прыгал на угол под которым находится мышь, пожалуйста, если не сложно, адаптируйте код под мой случай. Плюс когда я создал объект на сцене и ваш код применил к нему он почему-то стал вращаться не относительно своего центра, а относительно начала координат.
|
|
|||||
|
Регистрация: Apr 2009
Сообщений: 43
|
если честно не совсем понял смысла прикрепленного файла
там по сути тоже самое что вы на странице привели, способ работает, но как его прикрутить к моему коду я не знаю, так как у меня поворот происходит при драге мышью, с условием что я кликаю мышью на произвольный участок объекта он не должен сразу поворачиваться на этот угл, а должен поворачиваться только при перемещении мыши(естественно с нажатой кнопкой), то есть он не должен прыгать. Например: rotation объекта = 0, я кликаю мышью и атан2 расчитывает угол в 30 градусов, объект не должен сразу прыгать на эти 30 градусов, а программа должна их зафиксировать и сохранять эти 30 градусов при движении мыши, то есть я могу вращать объект кликнув по любому его месту, при этом угол объекта не будет выравниваться относительно мыши. фух, мног ослов, только мне кажется все равно не понятно ![]() Добавлено через 38 минут В общем приспособил ваш код, работает, но опять таки при клике на объект он мгновенно принимает угол под которым находится мышь. |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 43
|
вооот, я примерно так и делал, при жостком указании угла:
объект "прыгает" за мышью, алгоритм который мне приходит в голову - это фиксировать при первом заходе в обработчик onEnterFrame фиксировать угол мыши и стартовый rotation объекта, и потом при изменении из разницы прибавлять это изменение к rotation объекта, но у меня почему-то это не срабатывает. Добавлено через 3 часа 31 минуту ура, я сделал это вот функция которая делает то, что мне надо ![]() private var moving:Boolean = false; private var startAngle:Number; private function rotateObject():void { if(moving) { var newAngle:Number = Math.atan2(this.mouseY - layout_mc.y, this.mouseX - layout_mc.x)*180/Math.PI; var diff:Number = newAngle - startAngle; layout_mc.rotation += diff; startAngle = newAngle; } else { startAngle = Math.atan2(this.mouseY - layout_mc.y, this.mouseX - layout_mc.x)*180/Math.PI; moving = true; } } Последний раз редактировалось zakatnov; 05.03.2010 в 19:41. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:57. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| поворот объекта |
|
|