导航

  • 首页
  • Tags列表
  • 管理
  • 简繁转换
Search Engine Optimization 站外搜索 站内搜索
« 新版google earth让我困惑三大搜索巨头将支持统一站点地图协议 »

用ActionScript模拟万有引力

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

在主场景中添加一个名为"ball"的MovieClip,在主时间轴上添加如下代码:

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

实例:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Search



  • 互联网 站内搜索

最新留言

最近发表

站点统计

  • 文章总数:253
  • 评论总数:250
  • 引用总数:0
  • 浏览总数:405707
  • 当前样式:default
  • 当前语言:zh-CN

图标汇集

  • 订阅到抓虾
    新闻蚂蚁
    周博通
    订阅到狗狗
    google reader
    bloglines
    my yahoo
    newsgator
    netvibes
    Rojo
  • 通过 W3C XHTML 1.0 Transitional 校验
  • 通过 W3C CSS 校验
  • 订阅本站的 ATOM 1.0 新闻聚合
  • 订阅本站的 RSS 2.0 新闻聚合

Powered By Z-Blog 1.6 Final Build 60802

Copyright Yufuzi Some Rights Reserved.
E-mail:yufuzi80@126.com QQ:20168130
备案序号:苏ICP备06015492号