《flash MX编程与创意实现》这本书中还有其它例子,我个人只是觉得这个例子非常奇怪,最后运动方式竟然和真实的天体运方式几乎一至!也一个椭圆形的轨道,太不可思意了!
先简单介绍一下力驱动运动在flash中如何用actionscript来表现:作用于物体的力相加形成合力→ 合力产生加速度→ 加速度改变速度→ 速度改变位置。
1.计算合力:其实就是向量相加;
2.计算加速度:
a=f/m;在flash中可以认为运动物体的质量为1,此时a=f,也就是说加速度等于合力;
3.计算单位帧内速度的改变:
将单位帧内的速度与加速度相加:vel.plus(accel);
4.计算单位帧内位置的改变:
pos.plus(vel);
5.刷新物体位置:
mc._x=pos.x;
mc._y=pos.y;
万有引力公式:
Fg=Gm1m2/r2F是引力大小,m1m2是物体质量,G是万有引力常数;由于是模拟万有引力,并不需要精确计算,所以不需要考虑物体质量,引力常数可以自己定义。
gravitation.as
import Vector;
import mx.transitions.OnEnterFrameBeacon;
class gravitation {
static var __initBeacon = OnEnterFrameBeacon.init();
var obj:MovieClip;//受控对象
var pos:Vector;//起始位置
var vel:Vector;//初始速度
var anchor:Vector;//初始运动轨道中心
var G:Number;//引力常数
var netForce:Vector;//引力
function doForce():Void{
this.netForce = this.pos.minusNew (this.anchor);
var r = this.netForce.getLength();
this.netForce.setLength (-this.G / (r*r));
}
function move():Void{
this.vel.plus (this.netForce);
this.pos.plus (this.vel);
this.obj._x = this.pos.x;
this.obj._y = this.pos.y;
}
function setObj(o:MovieClip):Void {
this.obj = o;
}
function setPos(p:Vector):Void{
this.pos=p;
}
function setVel(v:Vector):Void{
this.vel=v;
}
function setAnchor(a:Vector):Void{
this.anchor=a;
}
function setG(g:Number):Void{
this.G=g;
}
function onEnterFrame (){
this.doForce();
this.move();
}
function resetAnchor(x:Number,y:Number) {
var z=new Vector(x,y);
this.setAnchor(z);
}
function gravitation(obj:MovieClip,pos:Vector,vel:Vector,anchor:Vector,G:Number){
this.setObj(obj);
this.setPos(pos);
this.setVel(vel);
this.setAnchor(anchor);
this.setG(G);
}
}
import gravitation;
import Vector;
var pos:Vector=new Vector(150,50);
var vel:Vector=new Vector(5,0);
var anchor:Vector=new Vector(250,180);
var abc:gravitation=new gravitation(ball,pos,vel,anchor,5000);
MovieClip.addListener(abc);
this.onMouseDown = function () {
abc.resetAnchor(this._xmouse,this._ymouse);
}









