这是一个我们在中学学习物理的时候都很熟悉的一个东西:单摆。
用鼠标拖绳子下面的小球然后释放,小球就会来回做自由摆动。
用鼠标按小球下面的红色按钮可以让小球停下来在最初的位置。
首先讲一下实现
原理:做一个MC,再在这个MC里面放一个子MC,同时给这个子MC加上一段控制其属性的AS代码,比如在这个单摆实例中就是让AS控制MC的
rotation属性(旋转角度)的变化来实现的。MC循环播放AS就循环执行,从而实现连续的运动。
接下来我们]进入制作阶段,学习怎样制作这个单摆,大家也不妨先自己思考一下自己的做法。

本实例的组件结构图 1、设置场景属性(Ctrl+M)。如下图所示: 主要设置movie的播放速度为
20fps。如果低于这个数值太多就会使做出来的单摆摆得太慢,而且看起来不连贯;如果高于这个数值太多做出来的单摆会摆得太快。
2、摆球的制作。新建一个球形按钮,取名:Ballbutton,如下图所示:
3、为摆球按钮添加控制代码。新建一个MC,取名:Ballbutton Clip,在场景中把按钮Ballbutton拖入,同时在按钮上加上下面的AS。
on (press) {
_parent._parent.move = true;
}
//当鼠标在按钮上按下时把它的上一级MC的上一级MC中的一个变量"move"赋值为true
on (release, releaseOutside) {
_parent._parent.move = false;
} //当鼠标在按钮上释放或者从按钮上移出时把它的上一级MC的上一级MC中的一个变量"move"赋值为false
4、制作吊链。新建一个MC,取名:Ball and Line。在场景中画一条直线 ,其属性为:W:0;H:128;X:0;Y:0; 线型如图中红色圆圈所示,采用这样的线型可以更好的表现出链子的形状。 然后在“绳子” 的下面把组件 Ballbutton Clip拖进来并赋予一个实例名:button,如下图所示:
5、阴影的制作。新建一个MC,取名shadow。如下图所示:
6、摆动的实现和控制。新建一个MC,取名:Ball System。在场景新建三个层: Action,Ball,,Shadow。
在Ball层,把组件Ball and line拖入到场景中,并赋予一个实例名:ball。
在Shadow层,把组件Shadow拖入到场景中如下图所示:并赋予一个实例名:Shadow。
分别在Ball层和Shadow层的第三帧插入帧,在Action层上的第一,二,三帧上插入关键帧。
◆、在Action层的第一帧上加上AS代码如下:
ball._rotation = rotation;//初始化ball的_rotation属性值;
to_rad = Math.PI/180;//数学中1π=180度,在这儿设置to_rad为一度所表示的弧度值;
◆、在Action层的第二帧上加上AS代码如下:
if (move == true) {
x = Math.max(Math.min(_xmouse, 128), -128);
//设置单摆当前的水平位置;128就是前面链子的长度;
rotation = (Math.asin(-x/128)/Math.PI)*180; //设置单摆的旋转角度
rot_vel = (rotation-old_rotation)/6;
} else {
rotation = rotation + rot_vel; //旋转角度累加;
rot_vel = rot_vel - rotation/90;
}
//下面代码使绳子、球和阴影运动
if (old_rotation != rotation) {
ball._rotation = rotation;
//设置球体和绳子的旋转角度“ball”就是球体和绳子构成的MC组件的实例名;
sin_value = Math.sin(rotation*to_rad);
shadow._x = -160*sin_value;
//由于阴影在水平方向的移动距离比球体的移动距离大,所以设置为160;
if (rotation<(last_rotation-5) or rotation>(last_rotation+5)) {
ball.button._rotation = -rotation*0.75;
//设置绳子下面的球体在运动时的旋转角度
scale = 100+Math.abs(sin_value)*100;
//设置阴影的大小
shadow._xscale = scale;
shadow._yscale = scale;
last_rotation = rotation;
}
old_rotation = rotation;
}
◆、在Action层的第三帧上加上AS代码如下:
call("2");
//调用第二帧的AS;call()的作用是调用某帧的AS或者是调用某指定的函数括号里面是数字就表示调用第几帧的AS,也可以是某帧的Label Name或者是某个函数的name!
gotoAndPlay(2); //跳到第二帧播放;起循环的作用
7、场景布置。回到Scene 1 在场景中拖入Ball System组件,赋予 Ball System组件一个实例名:ba 。为了更好的控制单摆停下来,我们在场景中拖入一个按钮,如下图所示那个红色的小按钮:
为按钮上加入下面的As代码:
on (release) {
ba.ball._rotation = 0; //设置单摆的旋转角度为0;
ba.move = not ba.move; //设置ba中的move变量的值;
}
这样当需要让单摆停下来时就只需要按下此按钮就行了!原文件下载学习