Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.03.2010, 17:01
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 1  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
По умолчанию Поворот двумерного объекта мышью

В общем создавал уже тему о том как поворачивать объект относительно его центра мышью, мне дали пару советов, которые я объединил и создал нечто:

Код AS3:
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

Старый 04.03.2010, 17:30
dixus вне форума Посмотреть профиль Отправить личное сообщение для dixus Найти все сообщения от dixus
  № 2  
Ответить с цитированием
dixus

Регистрация: Feb 2010
Сообщений: 33
У вас код излишне сложный, например вот этот кусок:
Код AS3:
		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);
			}
		}
можно заменить на элементарное
Код AS3:
layout_mc.rotation = Math.atan2(this.mouseY - layout_mc.y, this.mouseX - layout_mc.x);
PS: Пример не скачивается

Старый 04.03.2010, 17:49
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 3  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
Объект ведет себя также, может и правда я много на *****кодил, просто уже сил нет, месяц с этим маюсь, а гугл адекватных решений не дает, нашел один более менее нормальный пример, но там все на AS2, и со своей спецификой. Не знаю, у меня архив качается

Старый 04.03.2010, 18:06
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 4  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
Вот простой пример, написанный на коленке, где все работает как надо:
Код AS3:
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();
		}		
	}	
}

Старый 04.03.2010, 19:49
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 5  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
Это все конечно хорошо, но мне надо чтобы при клике по объекту он не прыгал на угол под которым находится мышь, пожалуйста, если не сложно, адаптируйте код под мой случай. Плюс когда я создал объект на сцене и ваш код применил к нему он почему-то стал вращаться не относительно своего центра, а относительно начала координат.

Старый 04.03.2010, 20:02
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 6  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
zakatnov, значит не внимательно применили код. У меня вращается вокруг своего центра.
А что значит "чтобы при клике по объекту он не прыгал на угол под которым находится мышь" ?
Вложения
Тип файла: zip src.zip (6.4 Кб, 476 просмотров)

Старый 05.03.2010, 00:32
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 7  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
если честно не совсем понял смысла прикрепленного файла там по сути тоже самое что вы на странице привели, способ работает, но как его прикрутить к моему коду я не знаю, так как у меня поворот происходит при драге мышью, с условием что я кликаю мышью на произвольный участок объекта он не должен сразу поворачиваться на этот угл, а должен поворачиваться только при перемещении мыши(естественно с нажатой кнопкой), то есть он не должен прыгать. Например: rotation объекта = 0, я кликаю мышью и атан2 расчитывает угол в 30 градусов, объект не должен сразу прыгать на эти 30 градусов, а программа должна их зафиксировать и сохранять эти 30 градусов при движении мыши, то есть я могу вращать объект кликнув по любому его месту, при этом угол объекта не будет выравниваться относительно мыши. фух, мног ослов, только мне кажется все равно не понятно

Добавлено через 38 минут
В общем приспособил ваш код, работает, но опять таки при клике на объект он мгновенно принимает угол под которым находится мышь.

Старый 05.03.2010, 02:53
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 8  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
zakatnov, вот еще простой код, который может натолкнет на правильную мыслю... что-то более серьезное родить за сегодня уже сил нет.
Вложения
Тип файла: zip simple.zip (11.0 Кб, 412 просмотров)

Старый 05.03.2010, 16:08
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 9  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
вооот, я примерно так и делал, при жостком указании угла:
Код AS3:
layout_mc.rotation = Math.atan2(blablabla);
объект "прыгает" за мышью, алгоритм который мне приходит в голову - это фиксировать при первом заходе в обработчик onEnterFrame фиксировать угол мыши и стартовый rotation объекта, и потом при изменении из разницы прибавлять это изменение к rotation объекта, но у меня почему-то это не срабатывает.

Добавлено через 3 часа 31 минуту
ура, я сделал это вот функция которая делает то, что мне надо
Код AS3:
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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
поворот объекта

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:57.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.