拖动旋转再研究
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; } }