Показать сообщение отдельно
Старый 15.11.2010, 21:54
FieryWall вне форума Посмотреть профиль Отправить личное сообщение для FieryWall Найти все сообщения от FieryWall
  № 25  
Ответить с цитированием
FieryWall
 
Аватар для FieryWall

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Собственно такой код (демо) с некоторыми результатами (отдельное спасибо другим as-программистам). Все что осталось - корректный поворот вокруг точки на заданном радиусе и указать точку поворота самого object в его центре:
Код AS3:
package {
	import flash.display.Sprite;
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	public class Main extends Sprite {
		var pot:Sprite;
		var rect:Sprite;
		var rec:Sprite;
		var point:Point;
		var save1:Point=new Point(0,0);
		var save2:Point=new Point(0,0);;
		var angle:Number;
		public function Main() {
			rect=new Sprite();
			rect.graphics.lineStyle(1);
			rect.graphics.drawRect(0,0,100,100);
			rec=new Sprite();
			rec.graphics.beginFill(0x000000);
			rec.graphics.drawRect(-5,-5,10,10);
			addChild(rect);
			rect.addChild(rec);
			rect.x=300;
			rect.y=170;
 
			point=new Point(100,100);
			pot=new Sprite;
			pot.graphics.beginFill(0xFF0000);
			pot.graphics.drawRect(-5,-5,10,10);
			addChild(pot);
			pot.x=point.x;
			pot.y=point.y;
 
			pot.addEventListener(MouseEvent.MOUSE_DOWN, potDownListener);
			pot.addEventListener(MouseEvent.MOUSE_UP, potUpListener);
 
			rec.addEventListener(MouseEvent.MOUSE_DOWN, onRecDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, onRecUp);
		}
		private function potDownListener(event:MouseEvent):void{
			pot.startDrag(false);
		}
		private function potUpListener(event:MouseEvent):void{
			point.x=pot.x;
			point.y=pot.y;
			pot.stopDrag();
		}
 
		private function onRecDown(event:MouseEvent):void{
			rect.startDrag(false);
			save1.x=mouseX;
			save1.y=mouseY;
			addEventListener(MouseEvent.MOUSE_MOVE, onRecMove);
		}
		private function onRecMove(event:MouseEvent):void{
			save2.x = mouseX;
			save2.y = mouseY;
			var p01:Point = save1.clone().subtract(point);//01 - значит вектор от точки 0 к точке 1
			var p02:Point = save2.clone().subtract(point);
			var modul01:Number = p01.length;
			var modul02:Number = p02.length;
			var a:Number = Math.atan2(
				(p01.x * p02.y - p02.x * p01.y) / (modul01 * modul02),
				(p01.x * p02.x + p01.y * p02.y) / (modul01 * modul02)
			);
			angle=a * 180 / Math.PI;
			rect.rotation=angle;
		}
 
		private function onRecUp(event:MouseEvent):void{
			rect.stopDrag();
			removeEventListener(MouseEvent.MOUSE_MOVE, onRecMove);
		}
	}
}
Добавлено через 13 минут
Цитата:
Сообщение от OFFmind Посмотреть сообщение
Может оффтопик:

Почему бы не использовать класс TransformTool от senocular. Это если важен только результат, а не сам принцип... просто сам недавно сталкивался с подобной проблемой, используя этот можно в Runtime изменять объект как в стандартом Flash редакторе.

А для поворота при нажатии кнопки идеально подходит TweenLite.

Еще раз извините, если это офф-топ, и тут главное - реализовать своими руками)))
И как эти классы включить в RunTime ?


Последний раз редактировалось FieryWall; 15.11.2010 в 22:09.