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;
}
}