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

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

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

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Question Анимированный startDrag

Помогите сделать такую вещь, есть мувиклипы с картинками, делаю startDrag, stopDrag для того чтобы их можно было перетаскивать. Как сделать так чтобы во время перетаскивания можно было менять их _rotation в зависимости от того в какую сторону тащишь. Нужно сделать эффект как будто берешь пальцами за край лист бумаги и по воздуху тянешь его, он соответственно не прямо перемещается а поворачивается на несколько градусов.
Или если есть где посмотреть похожую реализацию.
Спасиба.

Старый 07.02.2008, 13:34
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 2  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
То есть если я взялся за самый центр картинки, то никакого _rotate не происходит, а в остальных случаях как-то нужно расчитывать.

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

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
в AS3-реализации разберёшься?

Старый 07.02.2008, 14:20
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 4  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
попробую

Старый 07.02.2008, 20:40
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 5  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
NB! AS3-класс. суть метод
Код:
package {
	import flash.display.*;
	import flash.events.*;
	import flash.geom.Point;
	

	/**
	 * @author fljot (inreflected.com)
	 */
	public class PhysDraggable extends Sprite {

		private var halfDiagonalLength:uint;
		private var localCenterPoint:Point;
		private var localCapturePoint:Point;
		private var globalCapturePoint:Point;
		private var kRotation:Number;
		public static var MOVED:String = 'moved';

		
		public function PhysDraggable() {
			cacheAsBitmap = true;
			
			localCenterPoint = new Point(width / 2, height / 2);
			halfDiagonalLength = Math.round((width * width + height * height) / 4);
			
			addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
			
		}

		
		protected function init(e:Event = undefined):void {
			enableCursor();
		}

		
		protected function enableCursor():void {
			addEventListener(MouseEvent.MOUSE_OVER, onRollOver);
			addEventListener(MouseEvent.MOUSE_OUT, onRollOut);			
			var cursorPos:Point = localToGlobal(new Point(mouseX, mouseY));
			if (!(this as Sprite).hitTestPoint(cursorPos.x, cursorPos.y)) {
				onRollOut();
			} else {
				onRollOver();
			}
		}

		
		protected function disableCursor():void {
			removeEventListener(MouseEvent.MOUSE_OVER, onRollOver);
			removeEventListener(MouseEvent.MOUSE_OUT, onRollOut);
		}

		
		private function onRollOver(e:MouseEvent = undefined):void {
			dispatchEvent(new MouseEvent(HandCursor.ROLL_OVER));
		}

		
		private function onRollOut(e:MouseEvent = undefined):void {
			dispatchEvent(new MouseEvent(HandCursor.ROLL_OUT));
		}
		
		
		protected function onMouseDown(e:MouseEvent):void {
			
			dispatchEvent(new MouseEvent(HandCursor.SWITCH_STATE));
			
			localCapturePoint = new Point(mouseX, mouseY);
			
			//удаление от центра фоты относительно длины половины диагонали
			var dFromСenter:Number = Math.sqrt(((Math.pow((localCapturePoint.x - localCenterPoint.x), 2) + Math.pow((localCapturePoint.y - localCenterPoint.y), 2))) / halfDiagonalLength);
			//коэф поворота
			kRotation = Math.pow(dFromСenter, 2);
			// координата точки захвата
			globalCapturePoint = new Point(stage.mouseX, stage.mouseY);
			
			stage.addEventListener(MouseEvent.MOUSE_MOVE, drag, false, 0, true);
			stage.addEventListener(MouseEvent.MOUSE_UP, onRelease, false, 0, true);
			disableCursor();
		}

		
		protected function onRelease(e:MouseEvent):void {
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
			stage.removeEventListener(MouseEvent.MOUSE_UP, onRelease);
			removeEventListener(MouseEvent.MOUSE_UP, onRelease);
			dispatchEvent(new MouseEvent(HandCursor.SWITCH_STATE));
			enableCursor();
		}

		
		protected function drag(e:MouseEvent = undefined):void {
			
			//коориднаты центра объекта			
			var globalCenterPoint:Point = localToGlobal(localCenterPoint); 
			
			//точка захвата			
			var globalNewCapturePoint:Point = new Point(stage.mouseX, stage.mouseY); 			
					
			//смещение мыши(=точки захвата) в абс системе координат
			var shift:Point = new Point(globalNewCapturePoint.x - globalCapturePoint.x, globalNewCapturePoint.y - globalCapturePoint.y);
			
			//вектор локальной оси X (в абс координатах)
			var localXaxis:Point = new Point(globalCapturePoint.x - globalCenterPoint.x, globalCapturePoint.y - globalCenterPoint.y);			
			
			//сдвиг
			var localXaxisLength:Number = Math.sqrt(Math.pow(localXaxis.x, 2) + Math.pow(localXaxis.y, 2));
			
			//определяем угол между абс СК и локальной СК. через скалярное произведение [1,0](=ось X) и локальной оси x
			var cos_fi:Number = localXaxis.x / localXaxisLength;
			var fi:Number = Math.acos(cos_fi);
			if (localXaxis.y > 0) fi = -fi; //от -pi до pi
			
			
			//вычисляем относительное смешение вдоль локальных осей(в локальной СК)
			//т.е. переводим смещение  shift.x и  shift.y в локальную СК
			//var loc_dx:Number = shift.x*Math.cos(fi) - shift.y*Math.sin(fi); //смещение по x в локальной
			var loc_dy:Number = shift.x * Math.sin(fi) + shift.y * Math.cos(fi); //смещение по y в локальной
			
				
			
			//вычисляем угол поворта. из прямоугольного треугольника,
			//противоположный нужному углу катет - это вектор смещения курсора в проекции на локальную ось Y
			//прилегающий катет - расстояние от точки захвата до центра тяжести  
			//С УЧЁТОМ КОЭФ ПОВОРОТА
			var rel_dy_x:Number = loc_dy * Math.sin(fi); 
			//x-компонента проекции вектора смещения на локальную ось Y
			var rel_dy_x_rot:Number = rel_dy_x * kRotation;  
			//x-компонента проекции вектора смещения на локальную ось Y С УЧЁТОМ КОЭФ ПОВОРОТА
			var rel_dy_y:Number = loc_dy * Math.cos(fi);   
			//y-компонента проекции вектора смещения на локальную ось Y
			var rel_dy_y_rot:Number = rel_dy_y * kRotation; 
			//y-компонента проекции вектора смещения на локальную ось Y С УЧЁТОМ КОЭФ ПОВОРОТА
			var tan_psi:Number = Math.sqrt(Math.pow(rel_dy_x_rot, 2) + Math.pow(rel_dy_y_rot, 2)) / (2 * localXaxisLength);
			var psi:Number = Math.atan(tan_psi);
			if (loc_dy < 0) psi = -psi;
			
			//поворачиваем на угол. вращение вокруг точки захвата
			//this.rotation(psi, this._parent._xmouse, this._parent._ymouse);
			rotate(globalCapturePoint, psi);
			
			//cмещаем
			x += shift.x;
			y += shift.y;	
			
			//записываем новые координаты мыши для вычисления вектора смещение в следующий момент
			globalCapturePoint.x = globalNewCapturePoint.x;
			globalCapturePoint.y = globalNewCapturePoint.y;
			
			
			dispatchEvent(new Event(MOVED));
			if (e is MouseEvent) e.updateAfterEvent();
			
		}

		
		private function rotate(point:Point, angle:Number):void {
			var vector_x:Number = x - point.x;
			var vector_y:Number = y - point.y;
			var cos:Number = Math.cos(angle);
			var sin:Number = Math.sin(angle);
			var vector_rotate_x:Number = (vector_x * cos - vector_y * sin);
			var vector_rotate_y:Number = (vector_x * sin + vector_y * cos);
			x = vector_rotate_x + point.x;
			y = vector_rotate_y + point.y;
			rotation += angle * 180 / Math.PI;
		}
	}
}
и типа такой штуки можно сделать
Вложения
Тип файла: rar tracepaper.part1.rar (288.1 Кб, 86 просмотров)
Тип файла: rar tracepaper.part2.rar (278.9 Кб, 71 просмотров)


Последний раз редактировалось fljot; 08.02.2008 в 03:29.
Создать новую тему Ответ Часовой пояс GMT +4, время: 20:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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