flash编程

第10章
动态文本
在制作游戏的时候,有时需要一个文本框来记录用户的游戏得分,这个分数是根据游戏情况动态改变的。这时候,我们就需要用到动态文本。
动态文本与输入文本的区别在于它不能直接接受用户输入。
但是,动态文本可以用来显示不同样式和字体的文本。

10.1 动态文本
和输入文本一样,使用文本工具可以创建动态文本框,只需在属性面板中选择“动态文本”即可,如图10-1所示。

图10-1 动态文本的属性面板
要让动态文本框动态地显示文本,就需要在属性面板中为其设置变量名。如图10-1所示,将动态文本的变量名设为myDynamicText。在Flash影片播放时,只需改变动态文本变量的值,就可以改变动态文本框中显示的文本。
动态文本有3种基本格式:单行、多行和多行不换行,它没有输入文本的密码格式。
属性面板中间有3个按钮,其中:
= :可选,它决定了是否可以对动态文本框中的文本执行选择、复制、剪切等操作,按下表示可选。如果是输入文本,它是默认按下并且不可改变的,因为输入文本一定是可选的。
= :将文本呈现为HTML,它决定了动态文本框中的文本是否可以使用HTML格式,即使用HTML语言为文本设置格式。
= :在文本周围显示边框,它决定了是否在动态文本框周围显示边框。
怎样才能让动态文本框显示需要的文本呢?如下所示的脚本即在变量名为myDynamicText的动态文本框中显示“Welcome to ActionScript!”:
myDynamicText = "Welcome to ActionScript!";
上面的脚本是加在动态文本所在的时间轴上的。
动态文本的使用虽然很简单,但是用它可以做许多事情。
10.2 HTML格式
HTML即超文本置标语言,它是网页格式的一种显示规范。在浏览网页时,浏览器通过解读HTML标记将网页中的各种元素显示成需要的样式。在Flash中可以使用HTML来设置动态文本的格式。要使用HTML,首先需要按下属性面板中的 按钮。在Flash中使用HTML标记为动态文本设置格式的ActionScript如下所示:
myDynamicText = "<B>B:粗体</B>.<BR>";
myDynamicText += "<I>I:斜体</I>.<BR>";
myDynamicText += "<U>U:下划线</U>.<BR>";
myDynamicText += "<FONT COLOR='#F000F0'>FONT COLOR:颜色</FONT>.<BR>";
myDynamicText += "<FONT FACE='Arial Black'>FONT FACE:字体</FONT>.<BR>";
myDynamicText += "<FONT SIZE='28'>FONT SIZE:字号</FONT>.<BR>";
myDynamicText += "<A HREF='http://www.sina.com.cn'>A HREF:超链接</A>.<BR>";
运行该脚本,动态文本框如图10-2所示。


图10-2 使用HTML格式的动态文本
Flash中使用的并不是完整的HTML,而只是HTML中的一些标记,使用这些标记可以轻松地为动态文本设置各种格式。
Flash MX中可用的所有HTML标记如下所示:
= <B></B>:粗体
= <I></I>:斜体
= <U></U>:下划线
= <FONT FACE='face'></FONT>:设置字体
= <FONT SIZE='size'></FONT>:设置字号
= <FONT COLOR='#XXXXXX></FONT>:设置颜色
= <A HREF='address'></A>:网页超链接
= < ></P>:定义段落
= <BR>:换行
10.3 从文本文件中获取变量
通过ActionScript可以调用Flash影片外部文本文件中的变量。从外部文件中获取变量的方法非常有用,它可以在不改变Flash文件的基础上对Flash影片的内容作出修改。例如要用Flash制作一个天气预报动画,如果每天都对Flash文件进行修改就太麻烦了。而使用外部变量就只需要对文本文件作出修改。
要从外部文件中获取变量需要用到的命令是loadVariables,如下所示:
loadVariables("weather.txt", _root);
其中,第1个参数是Flash影片要获取变量的文件位置,第2个参数是文本变量要加载到的位置,可以是_root,也可以是某个影片剪辑或深度级别。Flash将来自外部文件中的变量值加载到与指定位置中具有相同变量名的文本字段中。
使用loadVariables命令要注意的是,指定的文本应以Flash影片中的文本变量名开始,否则不能被加载。本例weather.txt中的内容如下所示:
myDynamicText=Today is Friday,it's rainy!
打开文件loadVariables.fla,在主时间轴中有一个动态文本框,其变量名与weather.txt中的文本字段相同,当运行前面的脚本时,该文本框中显示:
Today is Friday,it's rainy!
如果在文本文件中为变量指定多行字符串,Flash将自动识别换行符,从而实现自动换行。
您可以修改文本文件中的内容,Flash中动态文本显示的内容也将作出相应的改变。
10.4 练习:滚动新闻
下面利用loadVariables命令和字符串函数制作如图10-3所示的滚动新闻栏。


图10-3 滚动新闻栏
(1)新建一个Flash文档并保存。
(2)在场景中绘制一个动态文本框,在属性面板中将其变量名设为text。
(3)选中文本框,按F8键将其转换为影片剪辑元件,在属性面板中将该影片剪辑实例命名为news。
(4)选中影片剪辑实例news,打开其动作面板,在其中添加如下ActionScript:
onClipEvent (load) {
loadVariables("news.txt", news);
v = 0;
}
onClipEvent (enterFrame) {
v++;
if (v == 1) {
text = text.substr(1, text.length-1)+text.substr(0, 1);
v = 0;
}
}
在onClipEvent(load)事件中使用loadVariables命令将外部文件news.txt中的文本调入到Flash影片中。
变量v用来控制新闻滚动的速度。
在onClipEvent(enterFrame)事件中使用String对象的substr方法将text中的字符串分拆重组,以实现字符串滚动的效果。
(5)在与该Flash文档保存位置相同的位置创建一个文本文档news.txt,在其中添加如下所示的字符:
text=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
其中的text变量与Flash中的动态文本变量名相同,其后的字符串可以根据需要添加。测试影片,效果如图10-3所示。

[此贴子已经被作者于2005-7-14 0:13:17编辑过]


顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#12
发表于 2005-7-14 08:13  资料  个人空间  短消息  加为好友 
第11章
Math对象
作为一门编程语言,进行数学计算是必不可少的。在数学计算中经常会使用到数学函数,如取绝对值、开方、取整、求三角函数值等,还有一种重要的函数是随机函数。ActionScript将所有这些与数学有关的方法、常数、三角函数以及随机数都集中到一个对象里面——Math对象。
Math对象是ActionScript的一块敲门砖,只有掌握了它,才能真正对ActionScript动画编程做到运用自如。

11.1 Math对象的方法
11.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
11.1.4 Math.min、Math.max
Math.min方法取两个数中较小的一个数,Math.max方法取两个数中较大的一个数,如:
trace(Math.min(9, 8));
trace(Math.max(9, 8));
输出窗口中显示:
8、9
11.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
11.1.6 Math.sqrt
除了用Math.pow计算一个数的开方,还可以使用Math.sqrt计算一个数的平方根,如计算64的平方根:
trace(Math.sqrt(64));
输出窗口中显示
8
它等同于:
trace(Math.pow(64, 1/2));
11.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
11.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 = v0*Math.random()+v0; //随机取得水平方向上的速度
vy = v0*Math.random()+v0; //随机取得垂直方向上的速度
}
}
}
onClipEvent (enterFrame) {
for (var i = 1; i<=num; i++) {
with (_root["snow"+i]) {
_x += vx; //在水平方向上运动
_y += vy; //在垂直方向上运动
if (_x<0) { //超出左边界,从右边界进入
_x = 500;
}
if (_x>500) { //超出右边界,从左边界进入
_x = 0;
}
if (_y>400) { //超出下边界,从上边界进入
_y = 0;
}
}
}
}
以上脚本除了用到数组、attachMovie、Math.random等知识外,还用到了with动作。with动作用来为一组动作脚本指定一个对象,如本例用with动作指定对象_root["snow"+i],并在其后的大括号中对该对象的多种属性进行修改,从而避免了为每一个属性重复指定相同的对象,使脚本更紧凑和更简化。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#13
发表于 2005-7-14 08:14  资料  个人空间  短消息  加为好友 
第12章
Color对象
运用好的色彩可以使Flash作品具有更大的感染力,许多好的作品在色彩搭配和控制上都做得很成功。
在ActionScript中,Color对象专门用来管理颜色。使用Color对象可以实现许多色彩特效。

12.1 Color对象
使用ActionScript中的Color对象(动作面板的“对象”/“影片”目录)可以改变影片剪辑的颜色,Color对象的setRGB方法用来设置影片剪辑实例对象的RGB值。但是并不能对影片剪辑直接使用setRGB命令,在使用Color对象的方法之前首先需要创建Color对象的实例,如下所示:
myColor = new Color(myMC);
其中的参数myMC是要改变颜色的目标影片剪辑,创建Color对象的实例之后即可调用Color对象的方法,如下所示:
myColor.setRGB(0xFF0000);
setRGB的参数是以十六进制表示的,0x表示十六进制,后面的6位数字每两位为一组,分别表示红、绿、蓝3种颜色成份。如0xFF0000表示纯红,0x00FF00表示纯绿,0x0000FF表示纯蓝,0xFFFF00表示纯黄。
当然,也可以用十进制的数字代替十六进制,如下所示:
myColor1 = new Color(myMC1);
myColor2 = new Color(myMC2);
myColor1.setRGB(0xFFFF00);
myColor2.setRGB(255*256*256+255*256);
trace(myColor1.getRGB().toString(16));
trace(myColor2.getRGB().toString(16));
其中,Color对象的getRGB方法用来获取由setRGB方法指定的颜色值。
运行脚本,输出窗口中输出:
ffff00
ffff00
在这里,使用十六进制比十进制要方便得多。
12.2 练习:改变影片剪辑的颜色
下面是一个应用Color对象的例子,通过选择颜色面板中的颜色方格,为汽车添加相应的颜色,如图12-1所示。
其中,颜色面板的每个方格中都有一个透明按钮,在每个按钮中添加ActionScript,从而逼真地模仿了Flash的颜色面板。
该例的制作过程如下:
[全屏欣赏]

图12-1 在颜色面板中为汽车选择颜色
(1)建立影片剪辑panel,第1层放置颜色面板的原始位图;第2层放置动态文本框,用来显示颜色的RGB值,如图12-1所示的#FF0033,动态文本变量名为colortext;第3层放置影片剪辑colorarea,当鼠标滑过颜色面板时,显示鼠标经过方格的颜色,它的实例名也为colorarea;第4层为每个颜色方格放置一个按钮cb,并在属性面板中将其alpha值设置为0。
(2)将影片剪辑panel拖放到场景中。
(3)新建1层colorcar,将经过处理的图片car.jpg导入进来,选择“修改”/“转换位图为矢量图”命令将其转换为矢量图,并将颜色填充为白色,如图12-2所示。


图12-2 将汽车位图转换为矢量图
(4)按F8键将白色的汽车矢量图转换为影片剪辑元件colorcar,并在场景中将其实例命名为colorcar。
(5)在主场景中新建1层car,导入事先处理好的图片car.png,这里使用png格式的图片是因为它保留了alpha通道,即具有透明度。将car.png与第2层中的colorcar影片剪辑对齐,如图12-3所示。


图12-3 将car.png和colorcar对齐
(6)重新进入颜色面板panel影片剪辑,为其中的按钮添加ActionScript。如为左上角第1个黑色方格的按钮添加的ActionScript如下所示:
on (rollOver) { //鼠标经过时
colortext = "#000000"; //在动态文本区中显示方格的RGB值
mycolor = new Color(colorarea);
mycolor.setRGB(0x000000); //将左上角颜色框设置成方格的颜色
}
on (rollOut) { //鼠标移出时
colortext = ""; //动态文本区中不显示
mycolor.setRGB(0xFFFFFF); //将左上角颜色框设置成白色
}
on (release) { //单击鼠标时
carbody = new Color(_root.colorcar);
carbody.setRGB(0x000000); //将colorcar设置成单击处方格的颜色
}
为第1列第7个红色方格的按钮添加的ActionScript如下所示:
on (rollOver) {
colortext = "#FF0000";
mycolor = new Color(colorarea);
mycolor.setRGB(0xFF0000);
}
on (rollOut) {
colortext = "";
mycolor.setRGB(0xFFFFFF);
}
on (release) {
carbody = new Color(_root.colorcar);
carbody.setRGB(0xFF0000);
}
其他按钮中的脚本与上类似,相应的RGB值可以在Flash的颜色面板中查找。
(7)按Ctrl+Enter测试影片,效果如图12-1所示。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#14
发表于 2005-7-14 08:16  资料  个人空间  短消息  加为好友 
 getYear方法返回简写年份,如1999年返回99,2003年返回103。
getFullYear方法返回完整的4位数年份,如2003年返回2003。
getMonth方法返回月份,如7月返回6。
getDate方法返回日期,如7月16日返回16。
getHours方法返回小时数,如下午1点返回13。
getMinutes、getSeconds和getMilliseconds方法分别返回分钟、秒和毫秒数。
getDay方法返回星期数,星期日返回0,星期一返回1,以此类推。
getTime方法返回自1970年1月1日上午8时至Date对象所指时间的毫秒数。
运行脚本,输出窗口中显示:
103,2003,6,8,13,56,45,679,2,1057643805679
即:2003年7月8日13点56分45秒679毫秒,星期二,距离1970年1月1日上午8时共1057643805679毫秒。
13.2 练习:万年历
本例使用Date对象制作如图13-1所示的万年历。
[全屏欣赏]

图13-1 万年历
使用该例万年历可以翻查任何一年任何一月的日历,单击返回按钮可以查看当天所在的月份,且当天以白色显示,如图13-1所示。本例的制作过程如下:
(1)在图层back加入背景图片back.jpg。
(2)在图层yearmonth添加两个动态文本框,变量名为displaymonth和displayyear,分别用来显示月和年,字体为Vineta BT,颜色为黄色。
(3)在图层button添加按钮,分别用来控制月份上翻查、月份下翻查、年份上翻查、年份下翻查和返回当天。
(4)建立一个影片剪辑元件daynum,在其中添加一个变量名为num的动态文本框,用来显示日期,它的颜色为绿色。在库面板中为daynum元件添加链接,链接标识符也为daynum。
(5)在图层Actions的第1帧中添加如下ActionScript:
MyDate = new Date(); //创建Date对象以获取系统时间
MyCurYear = MyDate.getFullYear();
MyCurMonth = MyDate.getMonth();
MonthNames = new array(); //记录每个月名称的数组
DaysOfMonth = new array(); //记录每个月天数的数组
if (MyCurMonth == 1) { //如果是二月,判断是否为闰年
if ((MyNewYear%4 == 0) && (MyNewYear%100 != 0) || (MyNewYear%400 == 0)) {
DaysOfMonth[1] = 29;
} else {
DaysOfMonth[1] = 28;
}
}
MonthNames[0] = "January";
MonthNames[1] = "February";
MonthNames[2] = "March";
MonthNames[3] = "April";
MonthNames[4] = "May";
MonthNames[5] = "June";
MonthNames[6] = "July";
MonthNames[7] = "August";
MonthNames[8] = "September";
MonthNames[9] = "October";
MonthNames[10] = "November";
MonthNames[11] = "December";
DaysOfMonth[0] = 31;
DaysOfMonth[2] = 31;
DaysOfMonth[3] = 30;
DaysOfMonth[4] = 31;
DaysOfMonth[5] = 30;
DaysOfMonth[6] = 31;
DaysOfMonth[7] = 31;
DaysOfMonth[8] = 30;
DaysOfMonth[9] = 31;
DaysOfMonth[10] = 30;
DaysOfMonth[11] = 31;
(6)在Actions层的第3帧插入关键帧,在其动作面板中添加如下ActionScript:
stop();
MyNewDate = new Date(MyCurYear, MyCurMonth, 1); //根据参数创建Date对象
MyNewYear = MyNewDate.getFullYear();
MyNewMonth = MyNewDate.getMonth();
displaymonth = MonthNames[MyNewMonth]; //根据Date对象设置显示的月份
displayyear = MyNewYear; //根据Date对象设置显示的年份
if (MyNewMonth == 1) {
if ((MyNewYear%4 == 0) && (MyNewYear%100 != 0) || (MyNewYear%400 == 0)) {
DaysOfMonth[1] = 29;
} else {
DaysOfMonth[1] = 28;
}
}
MyDaysOfMonth = DaysOfMonth[MyNewDate.getMonth()];
MyDay = MyNewDate.getDay();
for (i=1; i<=Number(MyDaysOfMonth); i++) { //显示当月的所有天数
attachMovie("daynum", "daynum"+i, i); //附加显示日期的影片剪辑
_root["daynum"+i].num = i; //修改影片剪辑内的动态文本
if (i == 1) { //如果是每月的第1天
if (MyDay == 0) { //星期日
_root.daynum1._x = 50; //_x坐标为50,位于SUN下面
} else if (MyDay == 1) {
_root.daynum1._x = 100;
} else if (MyDay == 2) {
_root.daynum1._x = 150;
} else if (MyDay == 3) {
_root.daynum1._x = 200;
} else if (MyDay == 4) {
_root.daynum1._x = 250;
} else if (MyDay == 5) {
_root.daynum1._x = 300;
} else if (MyDay == 6) {
_root.daynum1._x = 350;
}
_root.daynum1._y = 130; //_y坐标为130
} else { //如果不是第1天
_root["daynum"+i]._x = _root["daynum"+(i-1)]._x+50; //_x坐标增加50
_root["daynum"+i]._y = _root["daynum"+(i-1)]._y; //_y坐标不变
if (_root["daynum"+i]._x>350) { //_x坐标超出星期六
_root["daynum"+i]._x = 50; //回到星期日的位置
_root["daynum"+i]._y += 40; //_y坐标下移40
}
if (_root["daynum"+i]._y>290) { //_y坐标超出下边界
_root["daynum"+i]._y = 130; //回到第一行显示
}
}
}
MyNewDate = new Date(); //获取系统时间
colorday = MyNewDate.getDate(); //获取要以白色显示的日期
if ((_root.displayyear == MyNewDate.getFullYear()) && (_root.displaymonth == MonthNames[MyNewDate.getMonth()])) { //如果显示的月份为当前月份
MyColor = new Color(_root["daynum"+colorday]); //将当前日期设置成白色
MyColor.setRGB(0xFFFFFF);
}
(7)为年份上翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurYear--; //年份变量减1
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(8)为年份下翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurYear++; //年份变量加1
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(9)为月份上翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurMonth--; //月份变量减1
if (MyCurMonth == -1) {
MyCurMonth = 11;
MyCurYear--;
}
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(10)为月份下翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurMonth++; //月份变量加1
if (MyCurMonth == 12) {
MyCurMonth = 0;
MyCurYear++;
}
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(11)为返回按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
gotoAndPlay(1); //回到第1帧获取系统时间
}
(12)按Ctrl+Enter测试影片,效果如图13-1所示。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#15
发表于 2005-7-14 08:17  资料  个人空间  短消息  加为好友 
第13章

Date对象

Date 对象使您可以获取相对于通用时间(格林尼治平均时,现在叫做通用时间或 UTC)或相对于运行 Flash Player 的操作系统的日期和时间值。Date 对象的方法不是静态的,但仅应用于调用方法时指定的 Date 对象的单个实例。Date.UTC 方法是个例外,它是一个静态方法。
Date 对象以不同的方式处理夏时制,具体取决于操作系统和 Flash Player 的版本。
若要调用 Date 对象的方法,必须首先使用 Date 对象的构造函数创建一个 Date 对象的实例。








13.1 Date对象
Date对象(动作面板的“对象”/“核心”目录)也是ActionScript重要的内置对象之一。Date对象提供了很多处理通用时间(格林威治时间)或系统时间的方法。
Date对象由七部分构成,它们是:
= year:0~99表示1900~1999年,如果要表示在此以外的年,必须使用完整的4位数字。
= month:0~11表示1月~12月。
= date:1~31表示日期。
= hour:0~23表示小时数。
= minute:0~59表示分钟数。
= second:0~59表示秒数。
= millisecond:0~999表示毫秒数。
Date对象主要有两种创建方法,一种是通过指定时间创建一个Date对象的实例,这时至少要用到year和month两个参数,如下所示:
myDate = new Date(2003, 7, 8, 13, 16, 500);
另一种方法是通过获取系统时间创建一个Date对象的实例,这时不指定任何参数,如下所示:
myDate = new Date();
创建Date对象后即可使用Date对象的方法。如下所示:
myDate = new Date();
year = myDate.getYear();
fullyear = myDate.getFullYear();
month = myDate.getMonth();
dates = myDate.getDate();
hour = myDate.getHours();
minute = myDate.getMinutes();
second = myDate.getSeconds();
millisecond = myDate.getMilliseconds();
day = myDate.getDay();
time = myDate.getTime();
trace(year+","+fullyear+","+month+","+dates+","+hour+","+minute+","+second+","+millisecond+","+day+","+time);
getYear方法返回简写年份,如1999年返回99,2003年返回103。
getFullYear方法返回完整的4位数年份,如2003年返回2003。
getMonth方法返回月份,如7月返回6。
getDate方法返回日期,如7月16日返回16。
getHours方法返回小时数,如下午1点返回13。
getMinutes、getSeconds和getMilliseconds方法分别返回分钟、秒和毫秒数。
getDay方法返回星期数,星期日返回0,星期一返回1,以此类推。
getTime方法返回自1970年1月1日上午8时至Date对象所指时间的毫秒数。
运行脚本,输出窗口中显示:
103,2003,6,8,13,56,45,679,2,1057643805679
即:2003年7月8日13点56分45秒679毫秒,星期二,距离1970年1月1日上午8时共1057643805679毫秒。
13.2 练习:万年历
本例使用Date对象制作如图13-1所示的万年历。
[全屏欣赏]

图13-1 万年历
使用该例万年历可以翻查任何一年任何一月的日历,单击返回按钮可以查看当天所在的月份,且当天以白色显示,如图13-1所示。本例的制作过程如下:
(1)在图层back加入背景图片back.jpg。
(2)在图层yearmonth添加两个动态文本框,变量名为displaymonth和displayyear,分别用来显示月和年,字体为Vineta BT,颜色为黄色。
(3)在图层button添加按钮,分别用来控制月份上翻查、月份下翻查、年份上翻查、年份下翻查和返回当天。
(4)建立一个影片剪辑元件daynum,在其中添加一个变量名为num的动态文本框,用来显示日期,它的颜色为绿色。在库面板中为daynum元件添加链接,链接标识符也为daynum。
(5)在图层Actions的第1帧中添加如下ActionScript:
MyDate = new Date(); //创建Date对象以获取系统时间
MyCurYear = MyDate.getFullYear();
MyCurMonth = MyDate.getMonth();
MonthNames = new array(); //记录每个月名称的数组
DaysOfMonth = new array(); //记录每个月天数的数组
if (MyCurMonth == 1) { //如果是二月,判断是否为闰年
if ((MyNewYear%4 == 0) && (MyNewYear%100 != 0) || (MyNewYear%400 == 0)) {
DaysOfMonth[1] = 29;
} else {
DaysOfMonth[1] = 28;
}
}
MonthNames[0] = "January";
MonthNames[1] = "February";
MonthNames[2] = "March";
MonthNames[3] = "April";
MonthNames[4] = "May";
MonthNames[5] = "June";
MonthNames[6] = "July";
MonthNames[7] = "August";
MonthNames[8] = "September";
MonthNames[9] = "October";
MonthNames[10] = "November";
MonthNames[11] = "December";
DaysOfMonth[0] = 31;
DaysOfMonth[2] = 31;
DaysOfMonth[3] = 30;
DaysOfMonth[4] = 31;
DaysOfMonth[5] = 30;
DaysOfMonth[6] = 31;
DaysOfMonth[7] = 31;
DaysOfMonth[8] = 30;
DaysOfMonth[9] = 31;
DaysOfMonth[10] = 30;
DaysOfMonth[11] = 31;
(6)在Actions层的第3帧插入关键帧,在其动作面板中添加如下ActionScript:
stop();
MyNewDate = new Date(MyCurYear, MyCurMonth, 1); //根据参数创建Date对象
MyNewYear = MyNewDate.getFullYear();
MyNewMonth = MyNewDate.getMonth();
displaymonth = MonthNames[MyNewMonth]; //根据Date对象设置显示的月份
displayyear = MyNewYear; //根据Date对象设置显示的年份
if (MyNewMonth == 1) {
if ((MyNewYear%4 == 0) && (MyNewYear%100 != 0) || (MyNewYear%400 == 0)) {
DaysOfMonth[1] = 29;
} else {
DaysOfMonth[1] = 28;
}
}
MyDaysOfMonth = DaysOfMonth[MyNewDate.getMonth()];
MyDay = MyNewDate.getDay();
for (i=1; i<=Number(MyDaysOfMonth); i++) { //显示当月的所有天数
attachMovie("daynum", "daynum"+i, i); //附加显示日期的影片剪辑
_root["daynum"+i].num = i; //修改影片剪辑内的动态文本
if (i == 1) { //如果是每月的第1天
if (MyDay == 0) { //星期日
_root.daynum1._x = 50; //_x坐标为50,位于SUN下面
} else if (MyDay == 1) {
_root.daynum1._x = 100;
} else if (MyDay == 2) {
_root.daynum1._x = 150;
} else if (MyDay == 3) {
_root.daynum1._x = 200;
} else if (MyDay == 4) {
_root.daynum1._x = 250;
} else if (MyDay == 5) {
_root.daynum1._x = 300;
} else if (MyDay == 6) {
_root.daynum1._x = 350;
}
_root.daynum1._y = 130; //_y坐标为130
} else { //如果不是第1天
_root["daynum"+i]._x = _root["daynum"+(i-1)]._x+50; //_x坐标增加50
_root["daynum"+i]._y = _root["daynum"+(i-1)]._y; //_y坐标不变
if (_root["daynum"+i]._x>350) { //_x坐标超出星期六
_root["daynum"+i]._x = 50; //回到星期日的位置
_root["daynum"+i]._y += 40; //_y坐标下移40
}
if (_root["daynum"+i]._y>290) { //_y坐标超出下边界
_root["daynum"+i]._y = 130; //回到第一行显示
}
}
}
MyNewDate = new Date(); //获取系统时间
colorday = MyNewDate.getDate(); //获取要以白色显示的日期
if ((_root.displayyear == MyNewDate.getFullYear()) && (_root.displaymonth == MonthNames[MyNewDate.getMonth()])) { //如果显示的月份为当前月份
MyColor = new Color(_root["daynum"+colorday]); //将当前日期设置成白色
MyColor.setRGB(0xFFFFFF);
}
(7)为年份上翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurYear--; //年份变量减1
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(8)为年份下翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurYear++; //年份变量加1
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(9)为月份上翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurMonth--; //月份变量减1
if (MyCurMonth == -1) {
MyCurMonth = 11;
MyCurYear--;
}
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(10)为月份下翻查按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
MyCurMonth++; //月份变量加1
if (MyCurMonth == 12) {
MyCurMonth = 0;
MyCurYear++;
}
gotoAndPlay(2); //回到第2帧创建新的Date对象
}
(11)为返回按钮的动作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //单击时删除显示的日期
}
gotoAndPlay(1); //回到第1帧获取系统时间
}
(12)按Ctrl+Enter测试影片,效果如图13-1所示。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#16
发表于 2005-7-14 08:18  资料  个人空间  短消息  加为好友 
第14章

Sound对象

在时间轴中直接嵌入声音是制作Flash MV的一种通用手法,但是这种方法除了从头至尾地播放声音外,并不能对声音进行很好的控制。ActionScript内置的Sound对象(动作面板的“对象”/“影片”目录)为我们提供了管理和控制声音的一种好方法。


14.1 attachSound方法
Sound对象的attachSound方法与MovieClip对象的attachMovie方法类似,它在影片播放时将库中的声音元件附加到场景中。要使用该方法将声音附加到场景中,首先需要在库中为声音添加链接,为声音元件添加链接和为影片剪辑元件添加链接的方法类似,在要添加链接的声音元件中单击鼠标右键,在弹出的快捷菜单中选择“链接”命令,弹出“链接属性”对话框,如图14-1所示。

图14-1 “链接属性”对话框
进行如图14-1所示的设置后,单击“确定”按钮,添加链接后的声音元件如图14-2所示。

图14-2 添加链接后的声音元件
与Color对象和Date对象等其他内置对象一样,在使用Sound对象需要创建Sound对象的新实例,如下所示:
mySound = new Sound();
创建Sound对象的实例之后即可调用声音元件的链接,如下所示:
mySound.attachSound("music");
其中,attachSound方法的参数即是库中为声音元件添加的链接。仅仅执行以上操作还不够,必须使用下面的ActionScript让声音开始播放:
mySound.start();
如果操作执行无误,测试影片,一首动人的化蝶便开始播放了。
要停止用Sound对象播放的声音,可以使用如下所示的ActionScript:
mySound.stop();
14.2 练习:用按钮点歌
下面用以上的方法制作一个使用按钮点歌的影片,以加深对attachMovie方法的印象。
打开文件attachSound.fla,场景中添加了4个按钮和1个空影片剪辑,库中包含3个添加了链接的声音元件,它们的链接标识符分别为music1~music3,如图14-3所示

图14-3 attachSound.fla文件的编辑场景
在空影片剪辑的动作面板中添加如下所示的ActionScript:
onClipEvent (load) {
_root.turn = 1;
}
变量turn用来记录当前播放的曲目位置。
第2个按钮用来播放当前位置的曲目,在它的的动作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
mySound = new Sound();
mySound.attachSound("music"+_root.turn);
mySound.start();
}
不管当前是否有曲目正在播放,单击该按钮都将重新加载当前曲目,并从头开始播放。
第3个按钮用来停止播放当前位置的曲目,在它的动作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
}
单击该按钮,Sound对象停止播放。
第1个按钮用来使当前曲目回退一首并开始播放,在它的动作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
_root.turn--;
if (_root.turn<1) {
_root.turn = 3;
}
mySound = new Sound();
mySound.attachSound("music"+_root.turn);
mySound.start();
}
单击该按钮,曲目位置回退一首,并判断是否超出第1首,如果是,则跳到第3首,从而实现循环。
第4个按钮的作用与第1个按钮相反,它使当前曲目前进一首并开始播放,在它的动作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
_root.turn++;
if (_root.turn>3) {
_root.turn = 1;
}
mySound = new Sound();
mySound.attachSound("music"+_root.turn);
mySound.start();
}
单击该按钮,曲目位置前进一首,并判断是否超出第3首,如果是,则跳到第1首,从而实现循环。
14.3 loadSound方法
使用attachSound方法虽然可以动态地加载声音,但前提是需要将声音预先加入到库中,这样并不能避免文件过大的弊端。使用Sound对象的loadSound方法可以将Flash文件以外的MP3声音文件加载到影片中进行播放,这样可以有效地解决文件过大且播放的曲目有限的缺陷,使用loadSound方法可以播放计算机或网络中的任何MP3文件。
loadSound方法如下所示:
mySound.loadSound("url", isStreaming);
其中,url是指定要载入的MP3文件在计算机或网络中的路径,isStreaming是一个布尔值,用于指示加载的声音是作为事件声音还是作为声音流,为false时表示作为事件声音,为true时表示作为声音流。
事件声音在完全加载后才能播放。它们由动作脚本 Sound 对象进行管理,而且响应此对象的所有方法和属性。声音流在下载的同时播放。当接收的数据足以启动解压缩程序时,播放开始。
与attachMovie方法类似,使用loadSound方法的过程是:创建Sound对象、使用loadSound方法载入MP3文件、使用start命令播放声音以及使用Sound对象的其他方法控制声音或使用stop命令停止声音。
14.4 练习:从计算机中加载MP3
打开文件loadSound.fla,如图14-4所示。

图14-4 loadSound.fla文件的效果
其中有一个输入文本框,一个播放按钮和一个停止按钮。输入文本框的变量名为sound_url,在播放按钮的动作面板中添加了如下ActionScript:
on (release) {
mySound.stop();
mySound = new Sound();
mySound.loadSound(sound_url, false);
mySound.start();
}
单击该按钮,从输入文本框sound_url中获取MP3文件的路径,并将其作为事件声音(第2个参数为false)加载到影片中进行播放。
在停止按钮的动作面板中添加如下ActionScript:
on (release) {
mySound.stop();
}
单击该按钮,声音停止播放。
14.5 调节和控制声音
Sound对象不仅提供了动态加载声音、播放和停止声音的方法,而且也提供了调节声音和控制进度等方法,综合使用这些方法,完全可以用Flash做出一个具有较高品质的音乐播放器。
= start方法
如前所示,不使用参数时,start方法简单地从开始位置播放声音;start方法也可以接受参数,如下所示:
mySound.start(secondOffset, loop);
参数secondOffset指定声音开始播放的位置,如指定10,将从第10秒的位置开始播放声音。参数loop指定声音的循环次数。
= setVolume方法
setVolume方法用来设置音量,其使用方法如下所示:
mySound.setVolume(volume);
参数volume的值位于0~100之间,0表示无音量,100表示最大音量,声音播放时默认的音量为100。
= setPan方法
setPan方法用来设置声音的左右均衡,其使用方法如下所示:
mySound.setPan(pan);
参数pan的值位于-100~100之间,-100表示仅使用左声道,100表示仅使用右声道,0表示左右声道均衡。
= getBytesTotal方法
getBytesTotal方法以字节为单位返回声音对象的总大小。
= duration属性
Sound对象的duration属性返回整个声音对象持续的毫秒数。
= position属性
Sound对象的position属性返回声音已播放的毫秒数。
使用duration属性和position属性可以方便地控制声音的播放进度,这在制作播放器时是非常有用的。
= onSoundComplete事件处理函数
当声音播放完时自动调用onSoundComplete事件处理函数。
14.6 练习:MP3播放器
MP3播放器的效果如图14-5所示。

图14-5 MP3播放器效果图
其中,单击打开文件按钮可以打开一个输入文本框,在其中可以输入MP3文件的路径,单击关闭文件按钮可以关闭输入文本框。
左边的五个按钮分别用于控制MP3的播放、快进、快退、暂停、停止,右边的三个游标分别用于控制音量、声道和显示MP3的播放进度。
当播放MP3时,控制相关影片剪辑播放动画,当MP3停止时,所有动画同时停止。播放器上部还显示了日期和时间。在播放器上按下鼠标可以拖动播放器到任意位置。
下面来看MP3播放器的制作过程。
(1)在影片剪辑实例url的动作面板中添加如下ActionScript:
onClipEvent (load) {
_visible = false; //隐藏输入文本框
}
(2)在打开文件按钮的动作面板中添加如下ActionScript:
on (release) {
_root.url._visible = true; //显示输入文本框
}
(3)在关闭文件按钮的动作面板中添加如下ActionScript:
on (release) {
_root.url._visible = false; //隐藏输入文本框
}
(4)在播放按钮的动作面板中添加如下ActionScript:
on (release) {
_root.music.stop();
_root.music = new Sound();
_root.music.loadSound(_root.url.music_url, false);
//music_url是输入文本变量名,它所在的影片剪辑实例名为url
_root.music.start(); //开始播放
_root.music.onSoundComplete = function() { //播放结束时停止相关动画
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
};
if (_root.music.getBytesTotal()>0) { //有声音载入时开始相关动画
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
}
(5)在停止按钮的动作面板中添加如下ActionScript:
on (release) { //停止声音和相关动画
_root.music.stop();
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
}
(6)在快进按钮中添加如下ActionScript:
on (release) {
if ((_root.music.position/_root.music.duration)<0.95) {
pos = _root.music.position/1000; //获取MP3的当前进度
_root.music.stop();
_root.music.start((pos+0.05*_root.music.duration/1000), 1);
//从当前进度快进5%开始播放
if (_root.music.getBytesTotal()>0) { //有声音载入时播放相关动画
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
} else {
_root.music.stop();
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
}
}
(7)在快退按钮的动作面板中添加如下ActionScript:
on (release) {
if ((_root.music.position/_root.music.duration)>0.05) {
pos = _root.music.position/1000; //获取MP3的当前进度
_root.music.stop();
_root.music.start((pos-0.05*_root.music.duration/1000), 1);
//从当前进度快退5%开始播放
if (_root.music.getBytesTotal()>0) { //有声音载入时播放相关动画
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
} else {
_root.music.start();
if (_root.music.getBytesTotal()>0) {
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
}
}
(8)在暂停按钮的动作面板中添加如下ActionScript:
on (release) {
if (pause != 1) { //pause!=1表示播放状态,停止声音
_root.music.stop(); //停止声音和相关动画
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
pos = _root.music.position;
pause = 1; //标记暂停状态
} else { //pause==1表示暂停状态,播放声音
_root.music.start(pos/1000, 1); //在停止位置开始声音
if (_root.music.getBytesTotal()>0) { //有声音载入时播放相关动画
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
pause = 0; //标记播放状态
}
}
(9)控制音量、声道和进度的游标都是内嵌了按钮的影片剪辑。在音量游标影片剪辑的动作面板中添加如下ActionScript:
onClipEvent (load) {
left = _x-100;
right = _x;
top = _y;
bottom = _y;
}
onClipEvent (enterFrame) {
_root.music.setVolume(_x-left); //将音量游标和标尺左端的距离作为音量大小
}
(10)在音量游标内的按钮的动作面板中添加如下ActionScript:
on (press) {
startDrag("", false, left, top, right, bottom); //限制游标的拖动范围
}
(11)在声道游标影片剪辑的动作面板中添加如下ActionScript:
onClipEvent (load) {
left = _x-50;
right = _x+50;
top = _y;
bottom = _y;
center = _x;
}
onClipEvent (enterFrame) {
_root.music.setPan((_x-center)*2); //将声道游标和标尺中点的距离作为声道值
}
on (release, releaseOutside) {
stopDrag();
}
(12)在声道游标内的按钮的动作面板中添加如下ActionScript:
on (press) {
startDrag("", false, left, top, right, bottom); //限制游标的拖动范围
}
on (release, releaseOutside) {
stopDrag();
}
(13)在进度游标影片剪辑的动作面板中添加如下ActionScript:
onClipEvent (load) {
source = _x;
left = _x;
top = _y;
right = _x+100;
bottom = _y;
}
onClipEvent (enterFrame) {
_x = source+100*(_root.music.position/_root.music.duration);
}
(14)在进度游标内的按钮的动作面板中添加如下ActionScript:
on (press) {
startDrag("", false, left, top, right, bottom);
}
on (release, releaseOutside) {
_root.music.stop();
_root.music.start(((_root.face._xmouse-source)/100*_root.music.duration/1000), 1);
stopDrag();
}
(15)在整个播放器影片剪辑的动作面板中添中如下ActionScript:
onClipEvent (load) {
days = new Array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT');
datetime = new Date(); //创建Date对象
}
onClipEvent (enterFrame) {
mymonth = datetime.getMonth()+1; //mymonth是显示月份的动态文本变量名
mydate = datetime.getDate(); //mydate是显示日期的动态文本变量名
day = datetime.getDay();
myday = days[day]; //myday是显示星期的动态文本变量名
myhour = datetime.getHours(); //myhour是显示小时的动态文本变量名
if (myhour<10) {
myhour = "0"+myhour;
}
myminute = datetime.getMinutes(); //myminute是显示分钟的动态文本变量名
if (myminute<10) {
myminute = "0"+myminute;
}
mysecond = datetime.getSeconds(); //mysecond是显示秒的动态文本变量名
if (mysecond<10) {
mysecond = "0"+mysecond;
}
delete datetime; //删除Date对象
datetime = new Date(); //获取新的系统时间
}
(16)在播放器影片剪辑中加入了一个透明度为0的按钮,在它的动作面板中添加如下ActionScript:
on (press) {
this.startDrag("true"); //按下鼠标时拖动播放器
}
on (release, releaseOutside) {
this.stopDrag(); //释放鼠标时停止拖动播放器
}
(17)按Ctrl+Enter键测试影片,效果如图14-5所示。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#17
发表于 2005-7-14 08:19  资料  个人空间  短消息  加为好友 
第15章

实现与服务器的交互

作为Macromedia公司的网页三剑客之一,Flash理所当然地在网页设计和网络运用方面占占据着重要的地位。不仅可以在网页中嵌入Flash动画,而且可以使用Flash制作网站片头、导航条,甚至是全Flash的网站。借助于ActionScript,Flash也具备与服务器的交互功能。优秀的服务器端程序与ActionScript的结合将使网页更加精彩。

15.1 简单链接
使用ActionScript可以将Flash影片链接到指定的网页,这与HTML中的<A HREF>标记类似。如在按钮中添加如下ActionScript:
on (release) {
getURL(" http://www.macromedia.com";);
}
无论该Flash影片是独立存在的还是嵌入在网页中,单击该按钮都将启动浏览器并打开通过getURL命令指定的页面,这里是Macromedia公司的主页。
getURL动作位于动作面板的“动作”/“浏览器/网络”目录。
除了使用getURL命令,也可以直接在动态文本中添加超链接,如为动态文本变量url添加链接如下所示:
url = "<A HREF='http://www.macromedia.com'>The Macromedia Homepage.</A>";
在动态文本框中将显示The Macromedia Homepage.它与网页中的<A HREF>标记类似,只是链接文字下面没有下划线。
除了可以链接到网络中的地址,getURL命令还可以用来打开计算机中的文件夹和文件,如通过单击按钮打开F盘:
on (release) {
getURL("file:///f:");
}
通过单击按钮打开文件:
on (release) {
getURL("file:///f:/music/Stronger.DAT");
}
单击该按钮将打开如图15-1所示对话框。

图15-1 “文件下载”对话框
15.2 指定打开链接的目标框架或窗口
使用getURL可以指定浏览器中用来打开链接的框架或窗口,getURL命令的第2个参数即用来指定目标框架或窗口的名称。
如Flash影片所在的网页是由两个框架构成的,Flash所在的框架名为Frame1,另一个框架名为Frame2,可以使用如下所示的ActionScript在框架Frame2中打开目标网页:
on (release) {
getURL(" http://www.macromedia.com";, "Frame2");
}
指定窗口的方式与此相同。
在ActionScript中有4个特殊的关键字用来指示浏览器执行特殊的操作,如下所示:
= _blank
在新窗口中打开目标页,该窗口将应用默认的浏览器设置。
= _parent
在当前框架的父级打开目标页。
= _top
在当前框架的顶级窗口中打开目标页,无论当前窗口由多少子框架构成,目标页都将取代框架而占据整个窗口。
= _self
使用当前窗口或框架打开目标页。当getURL命令省略第2个参数时即默认此方式。
如在新窗口中打开目标页的ActionScript如下所示:
on (release) {
getURL(" http://www.macromedia.com";, "_blank");
}
如果要自定义浏览器中新窗口的大小或设置,你将需要用到javascript。
15.3 LoadVars对象
Flash MX版本提供了新增的LoadVars对象使你可以实现Flash与服务器的交互。
LoadVars 对象是 loadVariables 动作的替代方法,用于在 Flash 影片和服务器之间传输变量。
可使用 LoadVars 对象在下载时获取错误信息、进度指示和流数据。LoadVars 对象的工作原理非常类似于 XML 对象;它使用方法 load、send 和 sendAndLoad 与服务器进行通讯。LoadVars 对象和 XML 对象的主要差别在于 LoadVars 传输动作脚本的名称和值对,而不是 XML 对象中存储的 XML DOM 树。
LoadVars 对象与 XML 对象遵循相同的安全限制。
15.3.1 从服务器下载数据
和其他对象一样,在使用LoadVars对象之前必须使用构造函数创建一个LoadVars对象的实例,如下所示:
myVars = new LoadVars();
要从服务器获取数据可以使用命令load,只需在load命令中指定要下载据的链接地址,如下所示:
myVars.load("myURL.txt");
从这里看来,LoadVars对象的load命令和LoadVariables命令很相似,但是LoadVariables命令不能区别文本中的不同变量,而在load命令中可以指定要获取数据的变量,如文本url.txt中有如下内容:
ID=thyme& assword=cd99
在Flash文件的第1帧动作面板中添加如下ActionScript:
myVars = new LoadVars();
myVars.load("url.txt");
在第40帧的动作面板中添加如下ActionScript:
stop();
loadVariables("url.txt", _root);
_root.varID = myVars.ID;
_root.varPA = myVars.Password;
其中,第40帧的第1个动态文本变量名为ID,第2个动态文本变量名为varID,第3个动态文本变量名为varPA。脚本的运行结果如图15-2所示。

图15-2 loadVariables命令和LoadVars对象的load命令结果比较
需要说明的是,与loadVariables命令相同,load命令指定的链接文件也必须与Flash的播放文件在同一个文件目录下面。
15.3.2 向服务器上传数据
使用send命令可以向服务器上传数据,如下所示:
myVars = new LoadVars();
myVars.ID = "thyme";
myVars.Password = cd99;
myVars.send("mypage.asp", "_self");
以上的脚本创建一个LoadVars对象myVars,然后分别设置两个属性ID和Password,最后将该对象发送到服务器的mypage.asp页中。
参数_self表示将使用上传的变量从服务器获取信息以刷新当前页面。
使用sendAndLoad命令不仅可以上传数据,而且可以获取服务器的响应信息,如下所示:
mySendVars = new LoadVars();
myLoadVars = new LoadVars();
mySendVars.ID = "thyme";
mySendVars.Password = cd99;
mySendVars.sendAndLoad("mypage.asp", myLoadVars);
其中创建了两个LoadVars对象,myLoadVars作为sendAndLoad命令的第2个参数用于存放来自服务器的响应。
15.3.3 下载状态
使用load、send、sendAndLoad命令下载和上传数据有一定的速度限制,这种速度与客户端和服务器的数据传输速率有关,但是无论如何都不是刚一执行命令就能马上完成。如上面的例子,其中在第1帧执行load命令,在第40帧才使用脚本将其中的数据在动态文本中显示出来;如果只有1帧,在执行load命令后马上使用脚本为动态文本变量赋值,并不能实现我们预期的效果。
为了避免被动地等待数据传输,LoadVars对象提供了检测数据下载状态的办法。
使用getBytesLoaded和getBytesTotal方法可以了解数据下载的进度,传输的数据量小并且网络速度也并不是很慢时这两种方法并不能发挥明显的作用。如果要解决上例中的问题,可以定义一个在数据下载完成时执行的函数,当数据完全传输成功时,系统会自动启动该函数。
如要将文件load.fla的第40帧合并到第1帧,如果使用如下的ActionScript,结果如图15-3所示。
stop();
myVars = new LoadVars();
myVars.load("url.txt");
loadVariables("url.txt", _root);
_root.varID = myVars.ID;
_root.varPA = myVars.Password;

图15-3 数据未下载完成,动态文本不显示数据
如果将其中的脚本改写成如下所示,我们将得到正确的结果,如图15-4所示:
stop();
loadVariables("url.txt", _root);
myVars = new LoadVars();
myVars.load("url.txt");
myVars.onLoad = function() {
_root.varID = myVars.ID;
_root.varPA = myVars.Password;
};

图15-4 在数据下载完成时自动运行函数,动态文本显示数据
仅仅完成从服务器下载和向服务器上传数据是不够的,要用Flash更强大的应用程序就得编写相应的服务器端脚本,如前面提到的mypage.asp就是用ASP(Active Sever Pages)语言编写的动态页面。编写服务器端脚本的语言很多,如PHP、CGI、Perl等,限于篇幅,在此不予详细讲解。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#18
发表于 2005-7-14 08:19  资料  个人空间  短消息  加为好友 
第16章

XML运用

XML(eXtensible Markup Language可扩展置标语言),它是有别于HTML(Hyper Text Markup Language超文本置标语言)的一种数据表示规范。由于它极大的灵活性和方便性,在存储和表示数据方面占据了巨大的优势。
ActionScript中的XML对象为你提供了访问XML文档的途径,使用点语法和XML对象的属性可以方便地访问XML文档(既可以是存储XML数据的文本文档,也可以是XML格式的文档)中的具体数据,并可以在Flash中将外部XML文档中的数据显示出来。








16.1 XML基础
XML与HTML有相似之处,因为它们都使用标签(tag)。但是HTML中的标签都是HTML的语法所预定好的,如<font></font>表示字体,<br>表示换行等;而XML中的标签则可以由用户根据需要、习惯和爱好自由指定,如下所示是一个XML的例子:
<student>
<name>Thyme</name>
<age>18</age>
<score>
<English>94</English>
< hysics>86</Physics>
<Chemistry>99</Chemistry>
</score>
<grade>B</grade>
</student>
上例的XML文档定义了一个student对象,在student对象下面包含4组信息,分别是name、age、score和grade,在score下面又分为English、Physics、Chemistry这3类,以上这些成对出现的标志即是XML的标签,标签又称为XML的元素(element)或节点(node)。每对节点之间包含与该节点相对应的数据,这些数据又称为文本节点(text node)。该XML文档表示的数据结构如图16-1所示。

图16-1 XML文档的数据结构
使用XML表示的数据结构一目了然,这也是它之所以深受人们宠爱的原因之一。在Flash中使用XML对象可以方便地解析XML的数据结构,以访问需要的节点或数据。
XML的另一大优点就是可以使用简单的文本编辑器进行编辑,程序员可以很容易地编写出访问XML格式数据的程序。这也为使用Flash制作与服务器交互的影片提供了一条捷径。
16.2 XML对象
同ActionScript的其他对象一样,要使用XML对象,就得先创建XML对象的实例,其方法如下:
myXML = new XML();
XML对象提供了众多的属性、方法和事件,下面重点介绍常用的几种。
16.2.1 load方法
XML的load方法用于从指定的URL中加载XML文档,并使用下载的XML数据替换指定XML对象的内容。使用load方法加载的XML文档必须与Flash影片处于相同的文件夹中。如下所示的ActionScript创建并从外部文本文档中加载XML对象:
myXML = new XML();
myXML.load("XMLData.txt");
如下所示的ActionScript创建并从外部XML文档中加载XML对象:
myXML = new XML();
myXML.load("XMLData.xml");
和LoadVars.load方法类似,使用XML.load命令后并不能立即将外部文档中的数据加载到影片中,如果直接引用文档中的数据可能会得不到需要的结果。要判断XML文档是否已经加载到影片中,可以使用下面要介绍的onLoad事件。
16.2.2 onLoad事件
当从服务器上接收XML文档时,由Flash Player调用XML的onLoad事件。调用onLoad事件时自动返回一个参数success,如果成功地收到XML文档,则success参数为true;如果未收到该文档,或从服务器上接收响应时出现错误,则success参数为false。
onLoad事件的使用方法如下所示:
myXML = new XML();
myXML.load("XMLData.txt");
myXML.onLoad = function() {
if (success == true) {
trace("XML is successfully loaded");
} else {
trace("Something is wrong with the XML document");
}
};
16.2.3 childNodes属性
XML的childNodes属性返回指定XML对象的子级的数组,数组中的每个元素都是对表示子节点的XML对象的引用,也就是说childNodes属性将XML对象当前级的子级节点作为一个数据返回。与数据一样,使用方括号可以访问数据的每一个元素。
例如外部文档中有图16-1所示结构图的XML对象,先将其加载到影片中的XML对象中:
myXML = new XML();
myXML.load("XMLData.xml");
myXML.onLoad = function(success) {
if (success == true) {
trace(myXML.childNodes[0]);
}
};
运行以上脚本,输出窗口中将显示整个XML对象,如图16-2所示。

图16-2 使用childNodes属性访问整个XML对象
将上面脚本中的trace语句换成如下所示:
trace(myXML.childNodes[0].childNodes[0]);
运用脚本,奇怪,输出窗口中没有显示。其实并不是没有显示,而是因为<student>后面有一个换行,Flash没能识别这个换行,而是将一个空行也作为XML对象的一个节点了。如果要验证,可以运行以下脚本:
trace(myXML.childNodes[0].childNodes[1]);
输出窗口中显示:
<name>Thyme</name>
如果Flash Player不能识别空格和空行,那么就不能把XML文档写成很有层次的格式,也就不方便我们阅读了。事实上,不用担心,下一个属性将帮助你解决这个问题。
16.2.4 ignoreWhite属性
ignoreWhite属性的默认设置为false,当设置为true时,在分析过程中将放弃仅包含空白的文本节点。要解决前面遇到的问题,只需要将XML对象的ignoreWhite属性设置为true即可。
在上例中使用如下所示的ActionScript将在输出窗口中返回<name>Thyme</name>:
myXML = new XML();
myXML.load("XMLData.xml");
myXML.ignoreWhite = true;
myXML.onLoad = function(success) {
if (success == true) {
trace(myXML.childNodes[0].childNodes[0]);
}
};
如果要返回< hysics>86</Physics>就需要如下的ActionScript:
trace(myXML.childNodes[0].childNodes[2].childNodes[1]);
如何才能返回Physics字段中的86呢?下面的ActionScript可以吗:
trace(myXML.childNodes[0].childNodes[2] .childNodes[1].childNodes[0]);
上面的脚本的确是返回了86,但事实上,它返回的是86这个节点,而不是这个节点中的文本。要得到文本节点中的文本字段,就需要使用nodevalue属性。
16.2.5 nodevalue属性
nodevalue属性返回XML对象的节点值。如果XML对象为文本节点,则nodevalue为该节点的文本;如果该XML对象是XML元素,则其nodevalue为null。
要得到上例中的文本86,可以使用如下所示的ActionScript:
trace(myXML.childNodes[0].childNodes[2].childNodes[1].childNodes[0].nodevalue);
既然XML元素和XML的文本节点是有区别的,就有必要将这两种类型的节点区别开来。
16.2.6 nodeType属性
nodeType是一个只读属性,值为1表示XML元素,为3表示文本节点。如上例中,使用以下脚本将分别返回1和3。
trace(myXML.childNodes[0].childNodes[2].childNodes[1].nodeType);
trace(myXML.childNodes[0].childNodes[2].childNodes[1].childNodes[0].nodeType);
16.2.7 nodeName属性
与节点密切相关的还有一个nodeName属性。nodeName属性返回XML对象的节点名称,如果该XML对象是一个XML元素(nodeType==1),则nodeName是表示XML文件中节点的标签名称;如果该XML对象为文本节点(nodeType==3),则nodeName为null。如上例中,使用以下脚本将分别返回Physics和null:
trace(myXML.childNodes[0].childNodes[2].childNodes[1].nodeName);
trace(myXML.childNodes[0].childNodes[2].childNodes[1].childNodes[0].nodeName);
16.2.8 status属性
如果从外部加载进来的XML文档有漏洞,在Flash影片中引用时肯定会出现问题。XML对象的status属性可以帮助检查XML对象是否完整和存在缺陷。调用status属性将返回一个数值,该数值的不同状态分别表示不同的含义,如下所示:
= 0 没有错误;成功地完成了分析。
= -2 一个CDATA部分没有正确结束。
= -3 XML声明没有正确结束。
= -4 DOCTYPE声明没有正确结束。
= -5 一个注释没有正确结束。
= -6 一个XML元素有格式错误。
= -7 内存不足。
= -8 一个属性值没有正确结束。
= -9 一个开始标记没有匹配的结束标记。
= -10 遇到一个没有匹配的开始标记的结束标记。
通过分析status属性的不同值,可以对相应的XML文档作有针对性的检查和修改,直到没有错误为止。
16.3 练习:用表单显示XML文档内容
本练习的目的是使用表单加载和显示XML文档的内容,以对XML对象的各种常用属性、方法和事件有进一步的了解。本练习的源文件为XML.fla。在同一文件夹中包含一个XML格式的文档,其中的内容如下所示:
<form>
<formname>Author's Information</formname>
<Name>
<firstname>Thyme</firstname>
<familyname>CD</familyname>
</Name>
<IDNo.>510228198111079090</IDNo.>
<Address>
<mailID>610031</mailID>
<Street>New 2 Fu Qing West Road</Street>
<City>Chengdu</City>
<Country>China</Country>
</Address>
<Tel>
<Home>028-87732901</Home>
<Move>028-81822013</Move>
</Tel>
<E-mail>chendong2000will@sina.com</E-mail>
</form>
在文件XML.fla的第一帧中添加了table0~table17共18个动态文本,在帧动作面板中添加了如下所示的ActionScript:
stop();
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load("information.xml");
myXML.onLoad = function() {
if (myXML.status == 0) {
t0 = myXML.childNodes[0].childNodes[0].childNodes[0].nodevalue;
t1 = myXML.childNodes[0].childNodes[1].nodeName;
t2 = myXML.childNodes[0].childNodes[1].childNodes[0].childNodes[0].nodevalue;
t3 = myXML.childNodes[0].childNodes[1].childNodes[1].childNodes[0].nodevalue;
t4 = myXML.childNodes[0].childNodes[2].nodeName;
t5 = myXML.childNodes[0].childNodes[2].childNodes[0].nodevalue;
t6 = myXML.childNodes[0].childNodes[3].nodeName;
t7 = myXML.childNodes[0].childNodes[3].childNodes[3].childNodes[0].nodevalue;
t8 = myXML.childNodes[0].childNodes[3].childNodes[2].childNodes[0].nodevalue;
t9 = myXML.childNodes[0].childNodes[3].childNodes[1].childNodes[0].nodevalue;
t10 = myXML.childNodes[0].childNodes[3].childNodes[0].childNodes[0].nodevalue;
t11 = myXML.childNodes[0].childNodes[4].nodeName;
t12 = myXML.childNodes[0].childNodes[4].childNodes[0].nodeName;
t13 = myXML.childNodes[0].childNodes[4].childNodes[0].childNodes[0].nodevalue;
t14 = myXML.childNodes[0].childNodes[4].childNodes[1].nodeName;
t15 = myXML.childNodes[0].childNodes[4].childNodes[1].childNodes[0].nodevalue;
t16 = myXML.childNodes[0].childNodes[5].nodeName;
t17 = myXML.childNodes[0].childNodes[5].childNodes[0].nodevalue;
} else {
gotoAndStop("error");
}
};
第2帧用于显示XML文档加载出错的信息。将第2帧的帧标签设为error,在其中添加一个按钮“get more information”,在该按钮的动作面板中添加如下ActionScript:
on (release) {
gotoAndStop("errorinfor");
switch (myXML.status) {
case -2 :
errorinfor = "A CDATA has no correct ending";
break;
case -3 :
errorinfor = "XML declaration has no correct ending";
break;
case -4 :
errorinfor = "DOCTYPE declaration has no correct ending";
break;
case -5 :
errorinfor = "A comment has no correct ending";
break;
case -6 :
errorinfor = "An XML node has wrong format";
break;
case -7 :
errorinfor = "Memory of computer is not enough";
break;
case -8 :
errorinfor = "An attibute has no correct ending";
break;
case -9 :
errorinfor = "A beginning tag without an ending one";
break;
case -10 :
errorinfor = "An ending tag without a beginnig one";
break;
}
}
将第3帧的帧标签设为errorinfor,并在第3帧中添加一个名为errorinfor的动态文本。当单击“get more information”按钮时,将在第3帧中显示相关的出错信息。
XML文档无误时的Flash表单如图16-3所示。试着改一下XML文档的内容(以记事本方式打开information.xml进行修改),此时的Flash影片如图16-4所示。单击“get more information”,结果如图16-5和16-6所示。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#19
发表于 2005-7-14 08:20  资料  个人空间  短消息  加为好友 
第17章

Flash UI组件

Flash MX中新增了7种内置组件(Flash UI Components),它们是PushButton、CheckBox、RadioButton、ListBox、ComboBox、ScrollPane、ScrollBar。要将这些组件添加到影片中,只需要在组件面板中双击相应的组件或在组件上按下鼠标将其拖动到场景中。


17.1 组件面板
选择“窗口”→“组件”命令或按快捷键Ctrl+F7即可打开Flash MX的组件面板,如图17-1所示。
在组件面板中双击组件或是按下鼠标左键拖动组件都可以将组件添加到场景中。添加内置组件后,Flash的库面板中会添加一个名为Flash UI Components的组件夹,如果添加了不止一种组件,它们都将自动保存在这个组件夹中,所以不会给你带来多大麻烦。如图17-2所示为添加到场景中的各种组件。

图17-1 组件面板 图17-2 添加到场景中的组件状态
17.2 PushButton
在场景中添加了PushButton后,选中PushButton,它的属性面板如图17-3所示。

图17-3 PushButton的属性面板
单击属性面板右下角的“属性”按钮,属性面板将变成如图17-4所示。再单击“参数”按钮,属性面板将切换回原来的状态。

图17-4 单击“属性”按钮后的效果
在属性面板中PushButton有两个参数,Label即是PushButton的标签,即显示在按钮上的文字,默认的文字是Push Button。在Label栏单击,Label后的文本框变成可改写的,在其中输入要显示在按钮上的文字。Click Handler参数表示单击PushButton时要执行的函数,该函数必须与PushButton在同一条时间轴中。即如果PushButton位于主场景中,则它的事件处理函数应该在主时间轴的关键帧中。
在<实例名称>文本框中可以为PushButton命名,它将作为PushButton的name属性。单击PushButton时,name属性将作为参数传递给Click Handler指定的单击事件处理函数。
与用户创建的按钮一样,PushButton也可以使用按钮的on事件处理函数。
PushButton的使用方法见PushButton.fla。其中的函数如下所示:
function PushButtonClick(xbutton) {
trace(xbutton._name);
}
在场景中添加了3个PushButton,将Label分别设为“是”、“否”和“取消”,将Click Handler都设为PushButtonClick,将实例名称分别设为yes、no和cancel。按Ctrl+Enter键测试影片,分别在3个按钮上单击,输出窗口中将相应地显示yes、no和cancel。

17.3 CheckBox
CheckBox就是我们平常所见的复选框,它有选中和未选中两种状态,属性面板如图17-5所示。

图17-5 CheckBox的属性面板
CheckBox的Label参数与PushButton类似,Initial value参数是CheckBox的初始状态,false表示未选中,true表示选中,它们的区别如图17-6所示。

图17-6 Initial value参数分别为false和true时的区别
Label Placement参数决定Check Box的标签(Label)位于复选框的左边还是右边,它有两个值right和left,默认为right,Label Placement参数分别为right和left时的状态如图17-7所示。

图17-7 Label Placement参数分别为right和left时的状态
Change Handler参数与PushButton的Click Handler属性类似,表示改变CheckBox的状态时要调用的事件处理函数,该函数也必须与CheckBox位于相同的时间轴中。
改变CheckBox的状态时,它的实例名称将作为参数传递给事件处理函数,在编写脚本时可以利用这个属性。
CheckBox的使用方法见CheckBox.fla,其中用于CheckBox的事件处理函数如下所示:
function CheckBoxChange(xCheckBox) {
if (xCheckBox.getvalue() == true) {
trace("You like "+xCheckBox._name);
} else {
trace("You dislike "+xCheckBox._name);
}
}
getvalue方法用来获取CheckBox的状态,CheckBox还有getLabel以及setvalue、setLabel等方法,在此不再详述。
17.4 RadioButton
RadioButton即常说的单选按钮或单选项,它与CheckBox类似,但是在同一组RadioButton中只能有一个为选中状态,而一组CheckBox中的任意一个都可以为选中状态。RadioButton的属性面板如图17-8所示。

图17-8 RadioButton的属性面板
图17-8中的Label、Label Placement和Change Handler参数与前面的相似,Initial State参数与CheckBox的Initial value参数类似,表示RadioButton的初始状态。Group Name参数表示RadioButton所在的组,在同一组中只能有一个RadioButton被选中,而不同的组不会互相影响。Data参数可选(不是必须的,可以为空),它可以为RadioButton附带一个数据,使用getData方法可以访问该参数的值。
RadioButton的使用方法见RadioButton.fla,其中的函数如下所示:
function RadioButtonChange(xRadioButton) {
trace("You like "+xRadioButton.getData());
}
17.5 ListBox
ListBox即列表框,使用ListBox可以将多个选项综合在一个列表框中,从而代替CheckBox和RadioButton行使它们的功能。空的和添加选项后的ListBox如图17-9所示。

图17-9 空的ListBox和添加选项后的ListBox
ListBox的属性面板如图17-10所示。

图17-10 ListBox的属性面板
选中Labels或Data栏再单击鼠标,将打开如图17-11所示的值面板,单击 和 按钮可以添加或删除项目,单击 和 按钮可以将项目向下或向下移动。编辑时的值面板如图17-12所示。

图17-11 值面板 图17-12 编辑时的值面板
在值面板中添加完项目后,单击“确定”按钮即可。
Select Multiple参数决定ListBox中的项目是否可以多选,为false时不能多选,相当于一组RadioButton;为true时可以多选,相当于一组CheckBox。
使用getvalue方法返回有关列表框中当前选定项的信息。如果该项目没有指定的Data,则此方法返回该项目的Label;如果该项目有关联的Data,则此方法返回该Data。在单选列表框中使用getSelectedItem方法可以将选定的项目作为一个具有Label和Data属性的对象返回,在多选列表框中使用getSelectedItems方法可以将选定的项目作为一个具有Label和Data属性的数组返回。ListBox的使用方法见ListBox.fla。其中的函数如下所示:
function ListBoxChange(xListBox) {
trace(xListBox.getSelectedItem().Label+":"+xListBox.getSelectedItem().Data);
}
17.6 ComboBox
ComboBox即组合框,也即下拉列表框。既然称为组合框,ComboBox是由一个文本框和一个列表框组合起来的,平常只显示文本框,单击下拉箭头可以展开列表框,因此它比ListBox要节省许多空间。在ComboBox中选择一个项目的过程如图17-13所示,ComboBox的属性面板如图17-14所示。

图17-13 在ComboBox中选择一个项目的过程

图17-14 ComboBox的属性面板
它的第1个参数Editable,表示ComboBox是否可编辑。当Editable为false时ComboBox中的方框是不可编辑的;当Editable为true时ComboBox中的方框相当于一个输入文本框,你可以在其中输入字符,也可以在其下拉列表中进行选择。
ComboBox的Labels和Data参数与ListBox类似。Row Count参数表示ComboBox的下拉列表中可以直接显示的项数,超过这个项数就需要使用滚动条查看。默认的Row Count为8,你也可以根据需要进行修改。
ComboBox的使用方法见ComboBox.fla,其中的函数如下:
function ComboBoxChange(xComboBox) {
trace(xComboBox.getvalue()+":"+xComboBox.getSelectedItem().Data);
}
17.7 ScrollPane
ScrollPane组件包含水平滚动条、垂直滚动条和视图区,它的属性面板如图17-15所示。

图17-15 ScrollPane的属性面板
ScrollPane最重要的参数是Scroll Content,它代表视图区中要显示的影片剪辑的链接名称,即在库面板中元件的链接字段中的链接标识符。运行影片时,Scroll Content参数指向的影片剪辑将加载到视图区中显示。
Horizontal Scroll和Vertical Scroll参数都具有3个可选值:auto、true和false。当值为auto(自动)时,将根据加载的影片剪辑的实际大小是否超出视图区的边界来决定水平和垂直滚动的条的显示与否;当值为true时永远显示对应的滚动条;当值为false时不显示滚动条。
Drag Content参数决定视图区中的内容是否可以使用鼠标进行拖动,它有两个值:true和false。
除了在Scroll Content参数中指定要加载的影片剪辑外,还可以使用loadScrollContent命令将外部的swf文件加载到ScrollPane的视图区中。ScrollPane的使用方法见ScrollPane.fla,其中有两个ScrollPane,一个使用Scroll Content参数加载库中的影片剪辑graphic,另一个使用loadScrollContent命令将外部的pic.swf文件加载到视图区中,其脚本如下所示:
myScrollPane.loadScrollContent("pic.swf");
该文件的运行效果如图17-16所示。

图17-16 ScrollPane.fla的运行效果
17.8 ScrollBar

ScrollBar即滚动条,它可以添加到动态文本或输入文本中。其属性面板如图17-17所示。

图17-17 ScrollBar的属性面板
Target TextField参数指定与ScrollBar相组合的动态文本或输入文本的实例名称,将ScrollBar拖动到文本框要添加滚条的边框一侧,Target TextField参数的值将自动改变成与文本实例的名称相一致。
Horizontal参数决定ScrollBar是水平还是垂直的,为false时是垂直滚动条,为true时是水平滚动条。
ScrollBar的使用见ScrollBar.fla。

顶部
coolrain
管理员
Rank: 9 Rank: 9 Rank: 9


UID 40
精华 0
积分 12191
帖子 1203
威望 0 点
阅读权限 200
注册 2005-6-25
状态 离线
#20
发表于 2005-7-14 08:20  资料  个人空间  短消息  加为好友 
第18章
用ActionScript画图

Flash MX ActionScript的绘画方法位于动作面板的“对象”/“影片”/“MovieClip”/“绘画方法”目录下面。使用ActionScript的绘画方法可以定义线条样式、画直线、曲线、对图形进行填充以及清除所画图形等操作。


18.1 动态创建影片剪辑
由于绘画方法包含在影片剪辑中,所以在使用绘画方法前要创建影片剪辑。使用MovieClip的createEmptyMovieClip方法可以动态地创建影片剪辑,如下所示:
_root.createEmptyMovieClip("MovieClipName", depth);
其中,MovieClipName是创建的影片剪辑实例名,depth是创建的影片剪辑所在的深度级别。
18.2 绘画方法
18.2.1 linestyle
MovieClipName.linestyle ([thickness[,rgb[,alpha]]])
linstyle命令定义将要绘制的线条的样式,其中,参数thickness定义线条的粗细,rab参数定义线条的颜色,alpha参数定义线条的透明度。如:
linestyle(0, 0x000000, 100); //定义极细线条,颜色为黑色,不透明
linestyle(2, 0xFF0000, 50); //定义线条宽度为2,颜色为红色,透明为50%
定义了线条样式后即可以使用绘线命令绘制线条,绘制的线条都将保持与linestyle命令所定义一致的样式,直到使用新的linestyle命令为止。
18.2.2 moveTo
MovieClipName.moveTo (x,y)
moveTo命令将当前绘画位置移到指定的坐标点(x,y)。
moveTo命令一般用于新起一点开始画线。
18.2.3 lineTo
MovieClipName.lineTo (x,y)
使用当前线条样式从当前绘画位置向(x,y)绘制直线;当前绘画位置随后被设置为(x,y)。
18.2.4 curveTo
MovieClipName.curveTo (controlX,controlY,anchorX, anchorY)
使用由(controlX,controlY)指定的控制点,以当前的线条样式绘制从当前绘画位置到(anchorX,anchorY)的曲线。当前的绘画位置随后设置为(anchorX,anchorY)。使用curveTo命令最关键的就是控制点的确定。控制点相当于是所绘曲线起始点和终点切线的交点,如图18-1所示。


图18-1 控制点示意图
18.2.5 beginFill
MovieClipName.beginFill ([rgb[,alpha]])
beginFill命令表示填充的开始,参数rgb表示要用于填充的颜色,alpha表示透明度。在使用beginFill命令后所绘制的闭合路径将自动以beginFill命令指定的颜色和颜色进行填充。
18.2.6 beginGradientFill
MovieClipName.beginGradientFill (fillType, colors, alphas, ratios, matrix)
beginGradientFill用于在闭合路径中填充渐变色,参数fillType有两个值:linear表示线性渐变,radial表示放射渐变。colors是一个数组,包括要在渐变中使用的RGB十六进制颜色值。alphas也是一个数组,包括与colors数组中颜色相对应的Alpha值;有效值为0~100。如果该值小于0,则Flash使用0。如果该值大于100,则Flash使用100。ratios是颜色配额的数组;有效值为0~255。该值按100%定义了对颜色进行采样处的宽度的百分比。matrix 一个变形矩阵,是带有下列两组属性之一的一个对象:
= a、b、c、d、e、f、g、h、i,它们用于描述下列形式的 3×3 矩阵:
a b c
d e f
g h i
如果matrixType属性不存在,则其余参数都是必需的;如果缺少其中任何一个则该函数会失败。该矩阵缩放、平移、旋转和倾斜在(-1,-1)和(1,1)处定义的单位渐变。
= matrixType、x、y、w、h、r。
这些属性表示下列含义:matrixType 是字符串box、x是相对于该渐变左上角父级剪辑的注册点的水平位置,y是相对于该渐变左上角父级剪辑的注册点的垂直位置,w是渐变的宽度,h是渐变的高度,r是渐变的旋转角度(以弧度为单位)。
18.2.7 endFill
MovieClipName.endFill()
对调用beginFill或beginGradientFill方法以来添加的线条或曲线应用填充。Flash使用的是对beginFill或beginGradientFill的上一次调用中指定的填充。如果当前的绘画位置不等于moveTo方法中指定的上一个位置,而且定义了填充,则用线条闭合该路径,然后进行填充。
18.2.8 clear
MovieClipName.clear()
删除与影片剪辑关联的所有绘画命令。用Flash绘画工具绘制的形状和线条不受影响。调用clear方法还会删除当前的线条样式。
18.3 练习:全脚本的图形
使用绘图方法绘制全脚本的图形不难,主要是工作量比较大,要求细心。一般来说完全使用ActionScript命令绘制复杂图形的意义不是很大,作为了解已经足够了。
下面给出文件draw.fla的所有源程序,供你参考。其中主要用到的绘图方法有linestyle、moveTo、lineTo和curveTo,没有用到的方法请自己研究和练习。draw.fla的结果如图18-2所示(hoho,有点ugly)。
[全屏欣赏]

图18-2 使用绘图方法绘制的图形

_root.createEmptyMovieClip("girl", 1);
with (_root.girl) {
linestyle(0, 0x000000, 100);
beginFill(0x000000, 100);
moveTo(138, 164);
curveTo(119, 160, 98, 165);
curveTo(120, 155, 138, 164);
moveTo(156, 166);
curveTo(166, 162, 174, 164);
lineTo(174, 161);
curveTo(164, 160, 156, 166);
endFill();
linestyle(2, 0x000000, 100);
moveTo(133, 178);
curveTo(116, 166, 104, 183);
moveTo(132, 181);
curveTo(116, 169, 104, 184);
moveTo(132, 184);
curveTo(117, 170, 104, 184);
moveTo(128, 193);
curveTo(119, 197, 109, 193);
moveTo(126, 179);
curveTo(130, 191, 121, 195);
moveTo(117, 195);
curveTo(106, 184, 116, 175);
linestyle(0, 0x000000, 100);
moveTo(115, 179);
curveTo(118, 180, 118, 183);
curveTo(116, 185, 113, 183);
curveTo(114, 190, 119, 191);
curveTo(125, 190, 125, 185);
curveTo(124, 177, 115, 179);
linestyle(2, 0x000000, 100);
moveTo(151, 185);
curveTo(151, 177, 160, 173);
curveTo(168, 171, 173, 176);
moveTo(154, 180);
curveTo(162, 170, 171, 178);
moveTo(163, 174);
curveTo(170, 175, 170, 182);
moveTo(155, 192);
curveTo(163, 195, 167, 191);
moveTo(160, 175);
curveTo(153, 181, 155, 189);
curveTo(157, 192, 161, 192);
curveTo(171, 188, 163, 176);
linestyle(0, 0x000000, 100);
moveTo(160, 180);
curveTo(162, 182, 161, 183);
curveTo(159, 184, 158, 182);
curveTo(156, 187, 160, 189);
curveTo(164, 189, 164, 185);
curveTo(164, 180, 160, 180);
linestyle(2, 0x000000, 100);
moveTo(148, 185);
curveTo(147, 195, 153, 203);
curveTo(147, 207, 147, 209);
moveTo(130, 219);
lineTo(152, 218);
linestyle(3, 0x000000, 40);
moveTo(133, 225);
lineTo(143, 225);
linestyle(1, 0x000000, 100);
moveTo(174, 145);
curveTo(176, 157, 175, 172);
curveTo(173, 181, 172, 186);
lineTo(169, 212);
curveTo(169, 217, 164, 224);
lineTo(148, 242);
curveTo(144, 246, 135, 246);
curveTo(112, 242, 96, 230);
moveTo(71, 168);
curveTo(68, 164, 63, 164);
curveTo(58, 164, 55, 172);
curveTo(56, 191, 68, 204);
lineTo(74, 206);
linestyle(1, 0x000000, 60);
moveTo(70, 174);
curveTo(67, 170, 63, 169);
curveTo(54, 174, 62, 185);
curveTo(68, 200, 72, 192);
moveTo(71, 180);
curveTo(71, 177, 68, 177);
curveTo(65, 177, 65, 180);
curveTo(66, 185, 64, 189);
curveTo(70, 200, 72, 189);
curveTo(67, 184, 71, 181);
linestyle(1, 0x000000, 60);
moveTo(47, 151);
curveTo(55, 93, 113, 85);
lineTo(115, 87);
lineTo(116, 85);
curveTo(170, 92, 195, 130);
curveTo(207, 158, 194, 164);
curveTo(207, 152, 185, 123);
curveTo(203, 150, 189, 169);
curveTo(193, 150, 186, 138);
curveTo(197, 169, 179, 179);
curveTo(190, 174, 184, 145);
moveTo(176, 127);
curveTo(190, 165, 178, 174);
curveTo(184, 159, 178, 137);
curveTo(182, 156, 173, 169);
curveTo(179, 155, 175, 139);
moveTo(171, 123);
curveTo(181, 153, 164, 167);
curveTo(176, 146, 168, 127);
curveTo(175, 149, 159, 160);
curveTo(171, 141, 166, 129);
moveTo(161, 113);
curveTo(175, 141, 144, 164);
curveTo(161, 151, 161, 128);
moveTo(158, 127);
curveTo(159, 151, 143, 164);
curveTo(157, 147, 155, 119);
curveTo(152, 144, 120, 157);
curveTo(157, 136, 152, 106);
moveTo(150, 115);
curveTo(146, 139, 130, 150);
curveTo(140, 140, 147, 117);
curveTo(132, 149, 113, 153);
moveTo(145, 121);
curveTo(139, 132, 126, 141);
curveTo(116, 154, 97, 160);
moveTo(118, 141);
curveTo(103, 156, 98, 156);
moveTo(118, 141);
curveTo(105, 149, 98, 155);
curveTo(87, 162, 70, 163);
moveTo(101, 156);
curveTo(94, 163, 72, 163);
moveTo(71, 164);
curveTo(72, 222, 105, 318);
moveTo(74, 164);
curveTo(74, 185, 78, 205);
moveTo(77, 164);
curveTo(75, 194, 88, 241);
moveTo(80, 165);
curveTo(90, 245, 101, 292);
moveTo(72, 187);
curveTo(73, 225, 80, 250);
moveTo(82, 165);
curveTo(82, 210, 103, 259);
moveTo(85, 164);
lineTo(84, 193);
moveTo(90, 162);
lineTo(85, 171);
moveTo(95, 162);
lineTo(84, 177);
moveTo(172, 183);
curveTo(180, 247, 187, 263);
curveTo(200, 294, 195, 334);
moveTo(171, 200);
curveTo(174, 230, 182, 258);
moveTo(171, 212);
curveTo(170, 226, 183, 274);
curveTo(196, 314, 190, 331);
moveTo(168, 219);
curveTo(168, 234, 176, 263);
moveTo(165, 224);
lineTo(168, 242);
moveTo(163, 227);
curveTo(161, 251, 184, 296);
moveTo(166, 240);
curveTo(170, 253, 171, 268);
moveTo(173, 261);
curveTo(175, 272, 180, 281);
curveTo(188, 295, 189, 330);
linestyle(2, 0x000000, 100);
moveTo(68, 165);
lineTo(75, 154);
curveTo(68, 155, 62, 150);
curveTo(60, 150, 55, 154);
lineTo(50, 155);
lineTo(46, 163);
curveTo(49, 163, 50, 161);
curveTo(55, 162, 57, 166);
curveTo(62, 162, 68, 165);
moveTo(47, 159);
lineTo(58, 159);
curveTo(58, 156, 55, 157);
moveTo(44, 154);
lineTo(39, 148);
lineTo(18, 153);
curveTo(20, 160, 14, 167);
lineTo(30, 161);
curveTo(38, 164, 43, 163);
curveTo(40, 156, 44, 154);
moveTo(42, 157);
lineTo(36, 159);
lineTo(30, 157);
moveTo(44, 154);
curveTo(50, 150, 52, 153);
moveTo(44, 164);
curveTo(38, 167, 32, 166);
lineTo(22, 170);
lineTo(14, 170);
lineTo(4, 177);
curveTo(15, 179, 13, 191);
curveTo(22, 173, 43, 166);
curveTo(53, 182, 41, 203);
curveTo(53, 195, 62, 209);
lineTo(61, 196);
moveTo(57, 168);
curveTo(50, 169, 48, 163);
linestyle(1, 0x000000, 100);
moveTo(31, 171);
curveTo(13, 201, 21, 210);
moveTo(37, 168);
curveTo(15, 204, 24, 214);
moveTo(31, 187);
curveTo(20, 213, 31, 218);
moveTo(35, 195);
curveTo(27, 225, 37, 224);
moveTo(34, 206);
curveTo(35, 224, 40, 222);
moveTo(44, 167);
curveTo(33, 221, 44, 225);
moveTo(41, 209);
curveTo(42, 228, 52, 228);
moveTo(47, 199);
curveTo(43, 228, 57, 227);
moveTo(49, 199);
curveTo(50, 226, 60, 228);
curveTo(71, 227, 66, 202);
moveTo(64, 200);
curveTo(62, 244, 54, 201);
curveTo(61, 240, 60, 204);
linestyle(2, 0x000000, 100);
moveTo(189, 169);
curveTo(192, 166, 195, 169);
curveTo(199, 174, 206, 176);
curveTo(196, 181, 196, 191);
curveTo(190, 178, 181, 179);
curveTo(188, 182, 188, 186);
curveTo(189, 189, 194, 188);
moveTo(187, 173);
lineTo(193, 175);
moveTo(197, 184);
lineTo(208, 189);
lineTo(204, 193);
curveTo(199, 190, 189, 205);
curveTo(188, 192, 184, 190);
curveTo(182, 189, 182, 183);
curveTo(179, 182, 180, 179);
linestyle(1, 0x000000, 100);
moveTo(198, 193);
curveTo(207, 207, 193, 216);
moveTo(194, 203);
curveTo(195, 215, 188, 221);
moveTo(189, 204);
curveTo(192, 214, 186, 225);
curveTo(183, 227, 178, 224);
moveTo(180, 181);
curveTo(178, 186, 181, 191);
curveTo(187, 210, 182, 224);
moveTo(177, 181);
curveTo(176, 189, 180, 198);
curveTo(186, 213, 179, 223);
moveTo(181, 202);
curveTo(181, 219, 177, 218);
moveTo(176, 182);
curveTo(178, 199, 174, 205);
linestyle(2, 0x000000, 100);
moveTo(80, 248);
curveTo(74, 248, 79, 253);
lineTo(79, 259);
lineTo(85, 265);
moveTo(103, 293);
curveTo(113, 319, 123, 335);
moveTo(76, 249);
curveTo(76, 259, 70, 263);
curveTo(84, 271, 90, 283);
moveTo(106, 318);
lineTo(112, 336);
moveTo(69, 263);
curveTo(29, 284, 29, 295);
curveTo(18, 331, 16, 372);
curveTo(33, 377, 55, 374);
curveTo(56, 369, 68, 369);
curveTo(73, 375, 65, 377);
moveTo(47, 292);
curveTo(56, 312, 69, 329);
curveTo(63, 334, 63, 340);
moveTo(57, 312);
curveTo(60, 339, 69, 356);
lineTo(67, 358);
moveTo(65, 353);
lineTo(69, 370);
linestyle(1, 0x000000, 100);
moveTo(18, 363);
curveTo(40, 367, 48, 365);
curveTo(55, 359, 66, 360);
moveTo(19, 374);
curveTo(18, 387, 20, 400);
moveTo(64, 370);
curveTo(65, 388, 67, 400);
moveTo(83, 255);
curveTo(83, 260, 80, 261);
moveTo(137, 248);
curveTo(137, 259, 139, 269);
moveTo(138, 263);
curveTo(142, 267, 148, 268);
linestyle(2, 0x000000, 100);
moveTo(138, 254);
curveTo(156, 263, 157, 310);
curveTo(161, 327, 162, 335);
moveTo(141, 258);
curveTo(156, 270, 173, 273);
moveTo(159, 269);
curveTo(168, 289, 166, 314);
curveTo(167, 328, 169, 336);
moveTo(193, 287);
lineTo(202, 298);
curveTo(208, 336, 222, 365);
lineTo(215, 373);
lineTo(213, 374);
lineTo(195, 371);
moveTo(186, 307);
curveTo(181, 333, 185, 337);
lineTo(186, 342);
moveTo(63, 344);
curveTo(72, 338, 84, 337);
curveTo(103, 338, 140, 335);
curveTo(170, 335, 190, 347);
lineTo(187, 353);
moveTo(183, 346);
curveTo(205, 368, 185, 396);
linestyle(1, 0x000000, 100);
moveTo(213, 373);
lineTo(213, 400);
moveTo(136, 329);
curveTo(136, 331, 139, 335);
linestyle(2, 0x000000, 20);
moveTo(131, 324);
curveTo(132, 325, 136, 329);
moveTo(139, 324);
curveTo(138, 325, 136, 329);
linestyle(4, 0x000000, 10);
moveTo(131, 284);
curveTo(141, 280, 151, 282);
moveTo(119, 284);
curveTo(109, 280, 100, 284);
moveTo(123, 280);
curveTo(126, 282, 128, 279);
linestyle(7, 0x000000, 10);
moveTo(79, 343);
curveTo(90, 339, 101, 341);
lineTo(155, 341);
curveTo(167, 339, 184, 349);
moveTo(72, 396);
curveTo(128, 389, 180, 397);
linestyle(2, 0x000000, 20);
moveTo(132, 93);
curveTo(144, 95, 152, 105);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值