|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Вращение объекта вне зависимости от положения курсора относительно него
Здравствуйте. Существует код вращения объекта вокруг своей оси вслед за курсором:
В этом коде все хорошо, но курсор приходится перемещать вокруг объекта, а требуется, чтобы вращение осуществлялось вне зависимости от положения курсора относительно объекта. То-есть если где-то на сцене совершается вращательное движение курсором, то объект вращается вслед за ним. Как реализовать подобное? |
|
|||||
Вероятно что функция-обработчик событий мыши подписана на сам объект, а должна быть подписана например на stage
__________________
adobe AS3 manual |
|
|||||
А по-моему все нормально подписано. Если я правильно понял, автору нужно вращать курсором где-то вообще в стороне от объекта, и чтобы объект при этом так же крутился. Т.е. не смотрел постоянно на курсор, а просто повторял его движения.
Первое что приходит в голову, покадрово записывать положения мыши, сравнивать предыдущее положение с текущим, и по этим параметрам определять направление вращения. А по разнице величин определять скорость вращения. |
|
|||||
Попробуйте так
var moldX:Number = 0; var moldY:Number = 0; stage.addEventListener(MouseEvent.MOUSE_MOVE, objMove); function objMove(e:MouseEvent):void{ var dy:Number = (mouseY - moldY) * 20; var dx:Number = (mouseX - moldX) * 20; if(dy == 0 || dx == 0) return; var radians:Number = Math.atan2(dy,dx); var degrees:Number = radians / (Math.PI / 180); obj.rotation = degrees / 2; moldY = mouseY; moldX = mouseX; }
__________________
Кто хочет, тот ищет способ, а кто не хочет - тот ищет причину! Последний раз редактировалось Storfus13; 09.07.2012 в 13:49. |
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Storfus13, Спасибо, работает, правда очень дёргано, если курсор двигать медленно, даже со "сглаживанием", попробую использовать твины.
|
|
|||||
Так постабильнее (вычисляет направление вращения по 3-м точкам):
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private var _object:Sprite; private function init(e:Event = null):void { _object = new Sprite(); _object.graphics.lineStyle(1, 0xff0000); _object.graphics.lineTo(100, 100); _object.x = 250; _object.y = 250; addChild(_object); _rotation = _object.rotation; stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private var _points:Array = []; private var _rotation:Number; private function onMouseMove(event:MouseEvent):void { _points.push(new Point(mouseX, mouseY)); if (_points.length < 4) { return; } if (_points.length > 4) { _points.shift(); } var p0:Point = _points[0]; var p1:Point = _points[1]; var p2:Point = _points[2]; var p3:Point = _points[3]; var p01xp12:Number = (p1.x - p0.x) * (p2.y - p1.y) - (p1.y - p0.y) * (p2.x - p1.x); var p12xp23:Number = (p2.x - p1.x) * (p3.y - p2.y) - (p2.y - p1.y) * (p3.x - p2.x); _rotation += (p01xp12 + p12xp23) * .5; _object.rotation = _rotation; } } } Последний раз редактировалось expl; 09.07.2012 в 15:33. |
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Работает, но тоже как-то странно (то очень резко, то медленно). Вообще основная идея - сделать окно принятия решения как в игре Mass Effect:
http://www.cravingtech.com/blog/wp-c.../2008/06/2.jpg Там курсор вращается очень плавно. Есть идеи как это сделано? |
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Виноват, объясняю принцип работы:
В центре снизу расположено колесо состоящее из 6-ти сегментов, в его центре - курсор, при совершении вращательных движений мышью он вращается от сегмента к сегменту относительно центра колеса, по часовой или против часовой стрелки, в зависимости от движения мыши. Вращается плавно, без рывков. Начиная с некоторого небольшого радиуса (около 30 пикселов), скорость вращения не зависит от размера описываемых мышью кругов, один круг мышью - один полный поворот курсора на 360*. Если же описываемый круг имеет радиус меньше 30 пикселов, то вращение практически не происходит. Тот сегмент, на который направлен курсор - подсвечивается, так-же как и соответствующая сегменту надпись (вариант ответа). При клике левой кнопкой происходит выполнение действия назначенного на подсвеченный вариант, и диалог пропадает. Вроде всё Еще одна версия диалога: http://gamepart.ru/sites/default/fil...ect-325695.jpg |
|
|||||
Регистрация: Jun 2012
Сообщений: 70
|
Тоже возникла сейчас такая задача.
Приведенные выше методы, работают не так, как хочется.
__________________
Блог: http://devizgl.blogspot.com/ |
Часовой пояс GMT +4, время: 05:42. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|