![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
|
Помогите сделать такую вещь, есть мувиклипы с картинками, делаю startDrag, stopDrag для того чтобы их можно было перетаскивать. Как сделать так чтобы во время перетаскивания можно было менять их _rotation в зависимости от того в какую сторону тащишь. Нужно сделать эффект как будто берешь пальцами за край лист бумаги и по воздуху тянешь его, он соответственно не прямо перемещается а поворачивается на несколько градусов.
Или если есть где посмотреть похожую реализацию. Спасиба. |
|
|||||
|
Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
|
То есть если я взялся за самый центр картинки, то никакого _rotate не происходит, а в остальных случаях как-то нужно расчитывать.
|
|
|||||
|
Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
|
попробую
|
|
|||||
|
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;
}
}
}
Последний раз редактировалось fljot; 08.02.2008 в 03:29. |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:14. |
|
|
« Предыдущая тема | Следующая тема » |
|
|