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],并在其后的大括号中对该对象的多种属性进行修改,从而避免了为每一个属性重复指定相同的对象,使脚本更紧凑和更简化。 (责任编辑:admin) |