佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 4047|回复: 2

[转载]物理知识在FLASH世界中的应用(下篇)

[复制链接]
发表于 8-1-2005 10:50 PM | 显示全部楼层 |阅读模式
作者:cuiyysw



五:抛物运动


抛物运动是物体受外力开始运动后,没有再受到外力的作用,其水平运动和垂直运动是彼此独立的。不考虑空气阻力的影响,水平方向的运动是匀速直线运动,垂直方向的运动是

自由落体运动,(如图)



下面我们试着用程序来模拟平抛运动


步骤:

1。新建文件800*400像素其他的默认;

2。"ctrl"+F8,创建一个影片剪辑,名称“MC”

3。回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,

4。选中这个MC,打开对齐面版,相对于舞台---左对齐----底对齐,绑定代码:

onClipEvent(load){  //MC被加载时,只运行一次
  x0=_x;
  y0=_y;  //初使位置
  v=0;   //球的速度
  rad=0;  //球的角度,初使值为0
  t=0;        //运动时间
  dragtime=0;  //小球开始拖动的时间;
  isdrag=0;  //判断球是否被拖动的变量;
  isout=0; //判断球是否抛出去了
  g=-0.098;  //地心的引力常量
}


onClipEvent(mouseDown){  //当鼠标按下
  if(hitTest(_root._xmouse,_root._ymouse,true)){  //判断鼠标是否和小球接触
    isdrag=1;  //如果接触的话,就返回isdrag的值为1,目的只是用来做记号,告诉后面的程序执行相关的事件;
    isout=0;
    v=0;
    rad=0;
    this.startDrag();  //开始拖动
    dragtime=getTimer();  //获得拖动的时间
  }
}


onClipEvent(mouseUp){  //松开鼠标
  if(isdrag==1){
    isdrag=0;
    isout=1;
    t=1;
    rad=Math.atan2(_y-y0,_x-x0);  //弧度为单位计算并返回 y/x 的反正切
    v=Math.sqrt((_x-x0)*(_x-x0)+(_y-y0)*(_y-y0))/(getTimer()-dragtime);  //勾股定理,再用公式:v=s/t求出速度;
    this.stopDrag();  //停止拖动
  }
}


onClipEvent(enterFrame){  //进入贞,MC的Frame不断运行
  if(isout==1){
    _x+=v*Math.cos(rad)*t;
    _y+=v*Math.sin(rad)*t-(g*t*t)/2;  //见图解(平抛运动的公式)
    t++;  //t=t+1;
    if(_x>800 or _y>400 ){  //如果超出舞台的范围,就重设置MC的位置
      isout=0;
      _x=x0;
      _y=y0;
    }
  }
}


补充:由于抛物运动把时间计算在内的,所以不能单*enterFrame时事件改变小球的位置
加入变量“t”,每次触发enterFrame事件时,代表一个单位的时间变化,我这里用的是12.0fps


看效果:

Flash: http://www.flash8.net/bbs/UploadFile/2005-1/20051513916531.swf




补充:抛运动中的竖直上抛运动


物体以一定初速度沿竖直方向,向上抛出后,只受重力作用下的运动。

竖直上抛运动可分为两个阶段来,一个是上升过程,这时它的初速度和
重力加速度g方向相反,是匀减速直线运动。上升到最高位置的时候,末速度为零,
因此这个时候,物体开始作自由落体运动

这里就只补充程序几个思路吧,就不用物理公式来做了,原理是一样的



步骤:

1。新建文件550*400像素其他的默认;

2。"ctrl"+F8,创建一个影片剪辑,名称“MC”

3。回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,

4。选中这个MC,绑定代码:

onClipEvent (load) {
    t = 0;
    a = 1;
    v0 = 10;
}
onClipEvent (enterFrame) {
    _y  = (_y + ((a * t) - v0));  //不难看出,随着(a*t)的增加,_y的值也不断增加
    t++;
}


Flash: http://www.flash8.net/bbs/UploadFile/2005-1/2005151426387.swf




斜抛运动:

onClipEvent (load) {
    t = 0;
    a = 1;
    v0 = 10;
}
onClipEvent (enterFrame) {
    _x  = (_x + v0);
    _y  = (_y + ((a * t) - v0));  //按位运算,前面讲过了滴
    t++;
}


Flash: http://www.flash8.net/bbs/UploadFile/2005-1/20051514243153.swf





平抛

onClipEvent (load) {
    t = 0;
    a = 1;
    v0 = 10;
}
onClipEvent (enterFrame) {
    _x  = (_x + v0);
    _y  = (_y + (a * t));
    t++;
}


Flash: http://www.flash8.net/bbs/UploadFile/2005-1/20051514328624.swf







六: 自由落体运动


定义:物体只在重力的作用下,从静止开始下落的运动叫自由落体运动。


物理公式:s=1/2gt*t


1。新建文件550*500像素其他的默认;

2。"ctrl"+F8,创建一个影片剪辑,名称“MC”

3。回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,

4。选中这个MC,打开对齐面版,相对于舞台---居中对齐----上对齐,绑定代码:

onClipEvent (load) {
    t=0;
    g=9.8;  //自由落体的加速度;
}

onClipEvent (enterFrame) {
    t+=0.2;  //这个值随便你设置了试试:t+=0.5
    this._y=0.5*g*t*t;
    if(this._y>=500){  //判断是否超出场景;
    this._y=0;  //超出后,重设MC的位置
    t=0;  //重新开始后的时间是0
   }
}


效果:

Flash: http://www.flash8.net/bbs/UploadFile/2005-1/20051514545758.swf











七:摩擦运动


有这样一个经常出现的FLASH鼠标特效:

Flash: http://www.flash8.net/bbs/UploadFile/2005-1/20051514637100.swf


分析图片:



新建一个MC,绑定代码:

onClipEvent(load){
  _x=0;
  _y=0;
  speed=10;
}
onClipEvent(enterFrame){
  x=_root._xmouse; //获得鼠标的x轴的位置,并且附值给变量“x”
  y=_root._ymouse;
  _x+=(x-_x)/speed; //把鼠标和MC的距离分成“十等份”,当(x-_x)的值不点更新时(换句话说:MC越来越接近鼠标时),就出先带摩擦的运动效果,速度逐渐下


  _y+=(y-_y)/speed;
}



其实这个不难理解,如果一时想不明白的话,就多想想就会明白的^_^














八:运动中的缓冲(实用)


先看效果:

Flash: http://www.flash8.net/bbs/UploadFile/2005-1/2005151492215.swf



当我们将这个物体从A移到B时,会产生一个加速度,并且依次产生一个速度,产生的速度会改变物体运动方向,使其回到原来位置(A)。然而,当它回到初始位置时,又没有作用

力去让它停下来,因此它会继续沿BA方向朝C移动(过头了)。这时,弹簧又会产生一个加速度让物体回到它的初始位置(A),所以再没有阻碍力的情况下,物体将在其初始位置左

右不停的摆动(也就是简谐运动)    弹簧反作用力是由弹性系数“k”决定的。假设在一个无摩擦的理想状态中,这根弹簧是永远的伸缩摆动下去的(也就是简谐运动),

所以,,这里我们再引入一个阻碍常量“c”。就可以让它慢慢的停下来

公式:p=k*(p1-_p)+c*p;

k*(x1-x)//胡克定理的应用

c*xp//用让小球慢满停下来的摩擦方法


步骤:

1。新建文件550*400像素其他的默认;

2。"ctrl"+F8,创建一个影片剪辑,名称“MC”

3。回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,

4。选中这个MC,绑定代码:

onClipEvent (load){
  _x = 0;
  _y = 0;
  k= 0.4;  //摩擦系数
  c =0.7;  //阻碍常量,k,c两个常量是不是固定的,你可以根据自己的需要更改它的值
}

onClipEvent (enterFrame) {
  x1=_root._xmouse;  //把鼠标位置附给变量x1
  y1=_root._ymouse;

  xp = ((x1-_x)*k)+(xp*c);
  yp = ((y1-_y)*k)+(yp*c);  //见上面的解释
  this._x+= xp;
  this._y+=yp;  //this._y = this._y+yp
}




源贴:http://www.flash8.net/bbs/dispbbs.asp?boardID=1&ID=217660
回复

使用道具 举报


ADVERTISEMENT

发表于 10-1-2005 08:39 AM | 显示全部楼层
呵呵。我现在会用到这个东西来做工。
回复

使用道具 举报

发表于 16-12-2012 03:26 AM | 显示全部楼层
谢谢啊~ 分享给我朋友先~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 26-4-2024 01:29 PM , Processed in 0.059887 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表