对蓝色理想经典论坛中的一篇关于“物理学的弹性”教程的分析,讲解比较清晰……
首先,来认识一下弹性效果,我们这里把它理解为力,这个力拖动物体到目的地,并且当物体与目的地越远,这个力越大,就想弹簧上吊了一个物体!
现在,开始一步步写代码。
首先,随便制造一个mc,比如画一个小球,把它放在舞台的左边,对该mc写如下代码:
onClipEvent(load){
vx=1;
}
onClipEvent(enterFrame){
_x+=vx;
}
vx表示沿x轴方向的速度,_x+=vx 等于_x=_x+vx. 我们在mc每一桢都使其x坐标加上速度。测试动画,我们能看到小球匀速运动。那要是让它是变速的,怎么办?对了,我们可改变vx,让vx逐桢变换,即给它一个加速度:
onClipEvent(load){
vx=1;
ax=.1;
}
onClipEvent(enterFrame){
vx+=ax;
_x+=vx;
}
测试动画,我们看到小球逐渐加速。如果把vx变为5,ax该为-0.1,这时小球先减速,再反向加速。
我们的目的应是小球先向右加速,然后减速再反向,再循环,好像以一定点为中心振动。
下一步,我们设置一个中心,用tx表示该中心的x坐标,然后求出tx和_x间的距离,加速度ax与距离成正比,即距离越近,加速度越小。
onClipEvent(load){
tx=250;
}
onClipEvent(enterFrame){
// ax is a fraction of the distance from tx to _x
ax=(tx-_x)*.2;
vx+=ax;
_x+=vx;
}
现在,我们看到小球在来回跳跃,现实情况应该就像有能量损失,小球的振幅应逐渐减小。现在用k代替上式中的0.2,它就像弹簧的劲度系数;用damp=0.9表示每次振幅减小的幅度:
onClipEvent(load){
tx=250;
k=.2;
damp=.9;
}
onClipEvent(enterFrame){
// ax is a fraction of the distance from tx to _x
ax=(tx-_x)*k;
vx+=ax;
vx*=damp;
_x+=vx;
}
现在,你就可看到真实的弹性效果,你可改变参数damp和k;另外,如法炮制对y坐标采用同样的方法。代码如下:
onClipEvent(load){
tx=250;
ty=250;
k=.2;
damp=.9;
}
onClipEvent(enterFrame){
ax=(tx-_x)*k;
ay=(ty-_y)*k;
vx+=ax;
vy+=ay;
vx*=damp;
vy*=damp;
_x+=vx;
_y+=vy;
}
我们还让小球能被拖动,如下:
1.双击小球进入编辑状态;
2.选中整个小球,把它转变为一个按钮;
3.在按钮上写代码:
on(press){
startDrag("");
drag=true;
}
on(release, releaseOutside){
stopDrag();
drag=false;
}
4.回到mc的代码中,改变如下:
onClipEvent(enterFrame){
if(!drag){
ax=(tx-_x)*k;
ay=(ty-_y)*k;
vx+=ax;
vy+=ay;
vx*=damp;
vy*=damp;
_x+=vx;
_y+=vy;
}
}
到现在,我们用的是一个定点(250,250),我们也可把他改为鼠标的坐标,用_root._xmouse等来表示:
onClipEvent(load){
k=.2;
damp=.9;
}
onClipEvent(enterFrame){
ax=(_root._xmouse -_x)*k;
ay=(_root._ymouse -_y)*k;
vx+=ax;
vy+=ay;
vx*=damp;
vy*=damp;
_x+=vx;
_y+=vy;
}
至此,教程就算结束.
转自经典:Aero-lk
这份教程的目的是能产生出一定数量的条件下弹性效果的动作脚本提供一种起实际作用的知识。即弹性数学计算知识。从迅速移动、摆动到实际上的弹性动作,这些数学知识都是基于胡克定律的,而且几乎在每本关于物理的书上都能找到该定律。
概述:
弹性动画是非常吸引人的,它能赋予物体反应、动作上的灵性。问题关键在于要对有关数学原理有一个实际的理解。你必须熟悉以下三个基本术语:
position(p) : 位置(p)
velocity(v) : 速度(v)
acceleration(a) : 加速度(a)
上面三个概念在弹性动画中都有应用。你可能对这些事实非常熟悉了,即一根弹簧对外力有反应(例如拉伸作用),加在它身上的外力越大,那么这根弹簧的反作用力就越大。这个事实是弹性动画的基础,也就是所说的胡克定律。
弹簧反作用力是由被称为"弹性系数(k)"的常数决定的。进一步的说,在一个无摩擦的环境中,这根弹簧是永远的伸缩摆动下去的,只要一旦它被外力拉动。所以我们再引入一个"阻碍常量(c)"来限制动作慢慢的停下来。因此,下面就是我们要使用到的数学计算公式:
-k*(P-Po)=A //一个元素,其加速度与弹簧的位移比例
c*v=A //一个元素,其加速度与速度成比例已限制动作的进行
因此,
A=-k*(P-Po)+c*v
上面公式中:
Po是初始条件,也就是物体在屏幕上的初始位置、初始比例或者初始大小。
k是弹性系数
c是阻碍常数
在这个等式,你会注意到两项都会产生加速度,它会改变物体的速度,正如速度可以改变物体的位移一样。因此原理分析如下 : 当我们将一个物体从其初始状态而变为另一个状态时,一个加速度就产生了,它可以依次产生一个速度,而这个速度又会改变物体的位移以便使其回到原来状态。然而,当它回到初始位置时,又没有作用力去让它停下来,因此它会继续运动(过头了)。再一次,弹簧会产生一个加速度让物体回到它的初始位置,所以若没有阻碍力,物体将在其初始位置左右不停的摆动或者左右移动。初始状态可以是它在屏幕上的位置、大小、比例、透明度等等。
有关位移状态、速度和加速度的公式是:
A=-k*(P.current-P.initial) //即A=-k*(当前状态-初始状态)
V.current=c*V.last+A//即当前速度=c*前一速度+
P.current=P.last+V.current //即当前状态=前一状态+当前速度
将这种动作应用于MC的方法是:
onClipEvent (enterFrame) {
dx = this._xscale-xo; //初始化X轴坐标下的弹性形变或摆动
dy = this._yscale-yo; //初始化Y轴坐标下的弹性形变或摆动
ax = -_root.spring*dx; //生成X轴坐标下的加速度
ay = -_root.spring*dy; //生成Y轴坐标下的加速度
vx = vx*_root.damp+ax; //生成X轴坐标下的速度
vy = vy*_root.damp+ay; //生成Y轴坐标下的速度
this._xscale += vx; //将物体向其初始化的X轴坐标移动
this._yscale += vy; //将物体向其初始化的Y轴坐标移动
}
弹性值可以安下述方法设定其初始状态:
onClipEvent (load) {
xo = 100;
yo = 100;
}