代码改变世界

拖动旋转再研究

2010-04-09 22:05  hbb  阅读(246)  评论(0编辑  收藏  举报

 

package 
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	
	/**
	 * ...
	 */
	public class Main extends Sprite 
	{
		private var card:Card;
		private var oldMouseX:Number=-1;
		private var oldMouseY:Number=-1;
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			stage.stageFocusRect = false;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			card = new Card(180, 100, 0, stage.stageWidth*.5, stage.stageHeight*.5);
			addChild(card);
			
			addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onMouseDown(e:MouseEvent):void
		{
			card.free = false;
			card.mx0 = mouseX;
			card.my0 = mouseY;
			
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
		}
		
		private function onMouseUp(e:MouseEvent):void
		{
			card.free = true;
			card.vx += card.ax;
			card.vy += card.ay;
			stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
		}
		
		private function onEnterFrame(e:Event):void
		{
			if (card.free)
			{
				card.xx += card.vx;
				card.yy += card.vy;
			}
			else
			{
				// 处理鼠标信息
				var mx:Number = mouseX;
				var my:Number = mouseY;
				var dmx:Number = mx - card.mx0;
				var dmy:Number = my - card.my0;
				card.mx0 = mx;
				card.my0 = my;
				
				
				// 计算作用力(F=am)
				var fx:Number = (dmx - card.vx) * card.m;
				var fy:Number = (dmy - card.vy) * card.m;
				// 计算力臂:卡片定点到鼠标位置这段
				var ax:Number = mx - card.xx;
				var ay:Number = my - card.yy;
				// 转力=|作用力|x|力臂|xSin(夹角)
				// 为方便计算,采用2D向量的叉乘计算
				var t:Number = fx * ay - fy * ax;
				
				// 计算卡片的速度
				card.vx = dmx;
				card.vy = dmy;
				
				// 转力中作用力的单位是牛
				// 需要一个合适的转换系数
				card.vr += t * Card.F_FACTOR;
				card.xx += card.vx;
				card.yy += card.vy;
				
				// 计算以定点作为旋转时,注册点的偏移量
				var dx:Number = mx - card.xx;
				var dy:Number = my - card.yy;
				var cos:Number = Math.cos(card.vr * Math.PI / 180);
				var sin:Number = Math.sin(card.vr * Math.PI / 180);
				// 此偏移量即为离心力下的加速度
				card.ax = dx - (cos * dx + sin * dy);
				card.ay = dy - (cos * dy - sin * dx);
				card.xx += card.ax;
				card.yy += card.ay;
			}
			
			card.rr -= card.vr;
			
			card.vx *= card.damp;
			card.vy *= card.damp;
			card.vr *= card.damp;
			
			card.x = card.xx;
			card.y = card.yy;
			card.rotation = card.rr;
		}
		
	}
	
}
import flash.display.MovieClip;
import flash.geom.Point;

class Card extends MovieClip
{
	public static const F_FACTOR:Number = .005;
	
	public var m:Number = 1.0;
	
	public var vx:Number = .0;
	public var vy:Number = .0;
	public var vr:Number = .0;
	public var damp:Number = .8;
	
	public var xx:Number = .0;
	public var yy:Number = .0;
	public var rr:Number = .0;
	
	public var ax:Number = .0;
	public var ay:Number = .0;
	
	public var mx0:Number = .0;
	public var my0:Number = .0;
	
	public var free:Boolean = true;
	
	public function Card(w:Number, h:Number, r:Number = .0, x:Number = .0, y:Number = .0)
	{
		graphics.beginFill(0x654321);
		graphics.drawRect( -w*.5, -h*.5, w, h);
		graphics.endFill();
		
		this.x = xx = x;
		this.y = yy = y;
		rotation = rr = r;
	}
}