Flash AS教程:详细讲解Math对象

作者:网络 来源:佚名 更新时间:2009-12-02 20:08:25 点击:
 math对象,作为一门编程语言,进行数学计算是必不可少的。在数学计算中经常会使用到数学函数,如取绝对值、开方、取整、求三角函数值等,还有一种重要的函数是随机函数。actionscript将所有这些与数学有关的方法、常数、三角函数以及随机数都集中到一个对象里面——math对象。math对象是actionscript的一块敲门砖,只有掌握了它,才能真正对actionscript动画编程做到运用自如。
1  math对象的方法
1.1  math.abs
math对象中集合了许多常用数学函数。math.abs就是用来计算一个数的绝对值,即一个数去掉正负符号后的值。其用法如下:
x=math.abs(-9);
或:
x=math.abs(num1-num2);
11.1.2  math.round
math.round方法将一个浮点数四舍五入为最接近的整数,如:
trace(math.round(9.4));
trace(math.round(9.5));
trace(math.round(-9.4));
trace(math.round(-9.5));
trace(math.round(-9.6));
输出窗口中将显示:
9、10、-9、-9、-10
11.1.3  math.ceil、math.floor
math.ceil方法取比一个浮点数大且最接近的整数,math.floor方法取比一个浮点数小且最接近的整数。
如:
trace(math.ceil(9.1));
trace(math.floor(9.1));
trace(math.ceil(-9.1));
trace(math.floor(-9.1));
输出窗口中将显示:
10、9、-9、-10

1.4  math.min、math.max
math.min方法取两个数中较小的一个数,math.max方法取两个数中较大的一个数,如:
trace(math.min(9, 8));
trace(math.max(9, 8));
输出窗口中显示:
8、9

1.5  math.pow
math.pow方法用来计算一个数的乘方,它包含两个参数,第1个参数是底数(要乘方的数),第2个参数是幂(乘方数)。如计算5的3次方:
trace(math.pow(5, 3));
输出窗口中显示:
125
math.pow方法也可以计算一个数的开方,如计算125的开3次方:
trace(math.pow(125, 1/3));
输出窗口中显示
5

1.6  math.sqrt
除了用math.pow计算一个数的开方,还可以使用math.sqrt计算一个数的平方根,如计算64的平方根:
trace(math.sqrt(64));
输出窗口中显示
8
它等同于:
trace(math.pow(64, 1/2));

2  math对象的常数
math对象的常数有以下几个:
= math.pi:圆周率(大约为3.141593)。
= math.sqrt1_2:1/2的平方根的倒数(大约为0.707107)。
= math.sqrt2:2的平方根(大约为1.414214)。
= math.e:欧拉(euler)常数,自然对数的底(大约为2.718282)。
= math.ln2:2的自然对数(大约为0.693147)。
= math.ln10:10的自然对数(大约为2.302585)。
= math.log2e:e的以2为底的对数(大约为1.442695)。
= math.log10e:e的以10为底的对数(大约为0.434294)。
其中math.pi用得较多,如下面的脚本将弧度值arcdegree转换为角度值angledegree:
angledegree = arcdegree*(180/math.pi);
下面的actionscript将弧度1转换为角度:
arcdegree = 1;
angledegree = arcdegree*(180/math.pi);
trace(angledegree);
输出窗口中显示:
57.2957795130823

3  三角函数
math对象中的三角函数有:
= math.sin:正弦
= math.cos:余弦
= math.tan:正切
= math.asin:反正弦
= math.acos:反余弦
= math.atan:反正切
= math.atan2:从x坐标轴到点的角度
三角函数在actionscript中有着举足轻重的地位,它们在制作一些特效动画时将发挥重要的作用。在程序语言中通常以x和y标记位置,但是在一个圆周上使用x和y来标记位置并不是很容易。三角函数在处理与圆周相关的位置参数时很有效。如用某个圆的圆心位置为(x0,y0),半径为r,可以用y0+r*math.sin(0)表示该圆水平直径右端点的纵坐标,用x0+r*math.cos(0)表示该圆水平直径右端点的横坐标。如图11-1所示用正弦函数和余弦函数标出了一个圆周上4个点的坐标。
图11-1  用三角函数表示圆周上的点
如下所示的actionscript使影片剪辑绕圆周运动:
onclipevent (load) {
i = 0;
r = 150;
x0 = 275;
y0 = 200;
}
onclipevent (enterframe) {
i += 10;
this._x = x0+r*math.cos(i/(180/math.pi));
this._y = y0+r*math.sin(i/(180/math.pi));
}
此时的影片剪辑是沿顺时针方向转动的,如要让它沿相反方向转动,只需将i += 10改写成i -= 10即可。actionscript中的三角函数都是按照弧度计算的。一个完整圆周的弧度数为2*math.pi,大约是6.283185,而一个圆周的角度数是360。如要在三角函数中使用角度数,需要将其除以180/math.pi以转换为弧度数。
在上面的脚本中,i的值是递增的,而并没有限定在0~360之间。这是因为正弦函数和余弦函数是定义在负无穷~正无穷上的周期函数,它们的值是以360°为周期循环的。

11.4  字符串和数字的转换
在actionscript中,字符串和数字之间可以相互转换。在很多时候,将字符串转换为数字或将数字转换为字符串都是很有必要的。例如,在flash中有一个变量名为n的输入文本框和一个按钮,按钮中的
actionscript如下:
on (release) {
trace(n+7);
}
当在输入文本框中输入11,再单击按钮时,输出窗口将显示字符串“11”与字符串“7”相加的结果117,而不是数字11与数字7相加的结果8。这是因为从输入文本框中获得的是字符串,当表达式中有字符串和数字时,actionscript优先考虑字符串,将数字转换为字符串后再进行字符串运算。为了将字符串转换成数字,可以使用actionscript提供的函数number,如将上例所示的脚本改写成如下所示:
on (release) {
trace(number(n)+7);
}
当在输入文本框中输入11,再单击按钮时,输出窗口将显示结果18。如果number函数中的参数不能转换成数字,则返回结果nan。以“0x”开头的字符串将被解释为十六进制数。对于布尔值,true将转换为1,false将转换为0。例如将上例所示的脚本改写成如下所示:
on (release) {
n = n>10;
trace(number(n));
}
当输入的值小于等于10时,输出窗口中显示0;当输入的值大于10时,输出窗口中显示1。除了number函数以外,函数parseint可以将字符串转换成整数,函数parsefloat可以将字符串转换为浮点数。如将上例所示的脚本改写成如下所示:
on (release) {
trace(parseint(n)+7);
trace(parsefloat(n)+7);
}
当在输入文本框中输入11.99,再单击按钮时,输出窗口中将显示18和18.99。parseint和parsefloat在处理字符串时比number函数更专业一点,它们可以从字符串中取出能转换成数字的最长字符串进行转换,而忽略后面不能转换成数字的字符串。如将上例的脚本改写成如下所示:
on (release) {
trace(number(n)+7);
trace(parseint(n)+7);
trace(parsefloat(n)+7);
}
当在输入文本框中输入11t7.9并单击按钮时,输出窗口中将显示nan、18、18
parseint函数可以有两个参数,第2个参数在2~36之间,表示要转换的数字的基数,即进制数。如将二进制数1101转换为十进制整数:
trace(parseint(1101, 2));
输出窗口中显示13。
要将数字转换成字符串可以使用number对象(动作面板的“对象”/“核心”目录)的tostring方法。要使用tostring方法需要先创建一个number对象,其用法如下:
mynumber = new number(15);
trace(mynumber.tostring(2));
trace(mynumber.tostring(16));
tostring中的参数与parseint函数的第2个参数一样,都表示进制数。本例中的2和16分别表示将mynumber转换为二进制数和16进制数。运行脚本,输出窗口中显示
1111
f
如果省略参数,默认为十进制。

11.5  随机数
随机数在flash中的应用非常广泛。
在flash 5以前的版本中,使用random函数获取一个近似的随机数,如random(10)随机返回0~9这10个整数中的一个。但在flash mx中推荐使用math对象的random方法,即math.random(),该方法返回一个大于或等于0并且小于1的随机浮点数。math.random方法比random函数得到的结果更精确,但它并不能直接产生一个整数。我们可以使用别的办法将math.random方法产生的随机数转换为我们需要的整数,如要得到一个1~10之间的随机整数,可以使用如下所示的actionscript:
trace(math.floor(math.random()*10+1));

11.6  练习:下雪
打开文件snow.fla,这是一个利用attachmovie和math.random方法制作的下雪效果,其中每一片雪花的
大小、方向各不相同,如图11-2所示。
[全屏欣赏]
图11-2  下雪特效
该动画中形状各异的雪花与math.random函数密不可分,下面来看它的制作方法。
(1)在库面板中为snow影片剪辑创建链接,其链接标识符为snow,如图11-3所示。
图11-3  为影片剪辑添加链接
(2)将snow元件拖到场景中,选中该影片剪辑实例,在其中添加如下actionscript:
onclipevent (load) {
this._visible = false;
v0 = 3;                                   //速度
num = 50;                                //数量
vx = new array();                          //记录水平速度的数组
vy = new array();成                        //记录垂直速度的数组
for (var i = 1; i<=num; i++) {
_root.attachmovie("snow", "snow"+i, i);   //附加num个影片剪辑实例
scale = 100*math.random()+50;          //随机设定实例大小
with (_root["snow"+i]) {                //with语句
  _xscale = scale;
  _yscale = scale;
  _x = 500*math.random();           //随机出现在影片水平宽度范围
  _y = 400*math.random();           //随机出现在影片垂直高度范围
  _rotation = 360*math.random();      //随机旋转一个角度
  vx[i] = v0*math.random()+v0;       //随机取得水平方向上的速度
  vy[i] = v0*math.random()+v0;       //随机取得垂直方向上的速度
}
}
}
onclipevent (enterframe) {
for (var i = 1; i<=num; i++) {
with (_root["snow"+i]) {
  _x += vx[i];                      //在水平方向上运动
  _y += vy[i];                      //在垂直方向上运动
  if (_x<0) {                       //超出左边界,从右边界进入
   _x = 500;
  }
  if (_x>500) {                     //超出右边界,从左边界进入
   _x = 0;
  }
  if (_y>400) {                     //超出下边界,从上边界进入
   _y = 0;
  }
}
}
}
以上脚本除了用到数组、attachmovie、math.random等知识外,还用到了with动作。with动作用来为一组动作脚本指定一个对象,如本例用with动作指定对象_root["snow"+i],并在其后的大括号中对该对象的多种属性进行修改,从而避免了为每一个属性重复指定相同的对象,使脚本更紧凑和更简化。