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

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

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

Регистрация: Aug 2007
Сообщений: 168
Question Вращение круга мышью с регулируемой скоростью

Здравствуйте.

Необходимо реализовать реалистичное вращение круга мышью, причем так, чтобы "тугость" (скорость) этого вращения можно было регулировать, и чтобы вращение происходило в направлении движения мыши.
Вот код который есть сейчас, но он не позволяет регулировать скорость, да и вращение происходит слишком резко

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
 
	public class Spinner extends Sprite
	{
		static public const STAGE_WIDTH:int = 800;
		static public const STAGE_HEIGHT:int = 600;
 
		private var $mover:Sprite;
		private var $lastX:Number;
		private var $lastY:Number;
 
		public function Spinner() 
		{
			$mover = new Sprite();
 
			var mx:Matrix = new Matrix();
			mx.createGradientBox(STAGE_HEIGHT / 2, STAGE_HEIGHT / 2, Math.PI / 2);
			$mover.graphics.beginGradientFill('linear', [0xFF0000, 0x0000FF], [1, 1], [0, 255], mx);
			$mover.graphics.drawCircle(0, 0, STAGE_HEIGHT / 2);
			$mover.graphics.endFill();
 
			$mover.x = STAGE_WIDTH / 2;
			$mover.y = STAGE_HEIGHT / 2;
			this.addChild($mover);
 
			this.addEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);			
		}
 
		private function thisAddedToStageHandler(e:Event):void 
		{
			this.removeEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, moverMouseDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, moverMouseUpHandler);
		}
 
		private function moverMouseDownHandler(e:MouseEvent):void 
		{
			$mover.addEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
		}
 
		private function moverMouseUpHandler(e:MouseEvent):void 
		{
			$mover.removeEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
		}
 
		private function moverMouseMoveHandler(e:MouseEvent):void 
		{
			var thisX:Number = stage.mouseX - $mover.x;
			var thisY:Number = stage.mouseY - $mover.y;
			$mover.rotation = Math.atan2($lastY - thisY, $lastX - thisX) * 180 / Math.PI;
			$lastX = thisX;
			$lastY = thisY;
		}
 
	}
 
}
Подскажите что нужно добавить.

Старый 01.08.2011, 11:57
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
private var speed:Number = .5;
...
$mover.rotation = (Math.atan2($lastY - thisY, $lastX - thisX) * 180 / Math.PI)*speed;
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 01.08.2011, 13:45
AlliAS вне форума Посмотреть профиль Отправить личное сообщение для AlliAS Найти все сообщения от AlliAS
  № 3  
Ответить с цитированием
AlliAS
 
Аватар для AlliAS

Регистрация: Aug 2007
Сообщений: 168
Спасибо. Работает. Правда если скорость меньше 1, то круг не прокручивается полностью, что можно с этим сделать?

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Упс.
Код AS3:
private var step:Number = .5; //шаг в градусах +/-
...
$mover.rotation += step;
Если нужны ограничения, добавить проверки
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 01.08.2011, 14:17
AlliAS вне форума Посмотреть профиль Отправить личное сообщение для AlliAS Найти все сообщения от AlliAS
  № 5  
Ответить с цитированием
AlliAS
 
Аватар для AlliAS

Регистрация: Aug 2007
Сообщений: 168
Увы, не дошло (

Код AS3:
private var step:Number = .5; //шаг в градусах +/-
...
var thisX:Number = stage.mouseX - $mover.x;
			var thisY:Number = stage.mouseY - $mover.y;
			$mover.rotation = (Math.atan2(thisY, thisX) * 180 / Math.PI) * $speed;
			$mover.rotation += step;
Так нужно?

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
вот это:
Код AS3:
$mover.rotation = (Math.atan2(thisY, thisX) * 180 / Math.PI) * $speed;
не нужно.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 01.08.2011, 14:53
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 7  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Там всё не оч. весело %)
По-моему шаг считается чуток не так (лучше не предыдущее положение мыши запоминать, а предыдущий угол). И если шаг по модулю больше пи, то добавлять/отнимать 2*пи, чтоб стал меньше пи по модулю. А то переход между пи и -пи - не весёлый.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

Регистрация: Aug 2007
Сообщений: 168
Да, шаг использовать удобнее, только теперь возник вопрос как определить направление в котором движется курсор мыши (по часовой или против часовой стрелки), чтобы знать прибавлять ли шаг или отнимать?

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
Да, шаг использовать удобнее, только теперь возник вопрос как определить направление в котором движется курсор мыши (по часовой или против часовой стрелки), чтобы знать прибавлять ли шаг или отнимать?
Обычно смотрят только дельту по Y. Или по Х

Пример
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 01.08.2011, 21:48
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 10  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
 
	public class Main extends Sprite
	{
		static public const STAGE_WIDTH:int = 800;
		static public const STAGE_HEIGHT:int = 600;
 
		private var $mover:Sprite;
		private var prevPhi:Number;
		private var $rotation:Number;
 
		public function Main() 
		{
			$mover = new Sprite();
 
			var mx:Matrix = new Matrix();
			mx.createGradientBox(STAGE_HEIGHT / 2, STAGE_HEIGHT / 2, Math.PI / 2);
			$mover.graphics.beginGradientFill('linear', [0xFF0000, 0x0000FF], [1, 1], [0, 255], mx);
			$mover.graphics.drawCircle(0, 0, STAGE_HEIGHT / 2);
			$mover.graphics.endFill();
 
			$mover.x = STAGE_WIDTH / 2;
			$mover.y = STAGE_HEIGHT / 2;
			this.addChild($mover);
 
			this.addEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);			
		}
 
		private function thisAddedToStageHandler(e:Event):void 
		{
			this.removeEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, moverMouseDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, moverMouseUpHandler);
		}
 
		private function moverMouseDownHandler(e:MouseEvent):void 
		{
			prevPhi = Math.atan2(stage.mouseY - $mover.y, stage.mouseX - $mover.x);
			$rotation = $mover.rotation;
			$mover.addEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
		}
 
		private function moverMouseUpHandler(e:MouseEvent):void 
		{
			$mover.removeEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
		}
 
		private function moverMouseMoveHandler(e:MouseEvent):void 
		{
			const speed:Number = 0.3;
			var phi:Number = Math.atan2(stage.mouseY - $mover.y, stage.mouseX - $mover.x);
			var step:Number = phi - prevPhi;
			if (step > Math.PI)
				step -= 2 * Math.PI;
			else if (step < -Math.PI)
				step += 2 * Math.PI;
 
			//тут можно делать с шагом что угодно
			step *= speed;
 
			$rotation += step * 180 / Math.PI;
 
			prevPhi = phi;
 
			$mover.rotation = $rotation;
		}
 
	}
 
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.


Последний раз редактировалось -De-; 01.08.2011 в 22:11.
Создать новую тему Ответ Часовой пояс GMT +4, время: 20:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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