FLASH脚本8

来源:互联网 发布:网络语咸鱼是什么意思 编辑:程序博客网 时间:2024/05/17 01:57
8、FLASH脚本-while与 do while循环、循环语句的嵌套、组件  二十二、while与 do while循环
在编程的许多问题中都要用到循环结构,比如要对 10 个数字的排序,两个数字之间的比较,如
果采用选择结构,进行的条件分支非常多,所以写的代码也相当长,利用循环结构可快速解决
这个问题,大大提高程序的效率.
ActionScript 语言中可通过四种语句实现程序的循环,分别是 while、do...while、for 循环和
for in 循环语句.它们与 if 语句的最大区别在于只要条件成立,循环里面的程序语句就会不
断地重复执行.而 if语句中的程序代码只可能被执行一次.
while 的格式如下:
while(条件表达式) {
循环体;
}
说明:在运行语句块之前,首先测试条件表达式;如果该测试返回 true,则运行该语句块。
如果该条件为 false,则跳过该语句块,并执行 while 动作语句块之后的第一条语句。其流
程图如图所示. 通常当计数器变量小于某指定值时, 使用循环执行动作。 在每个循环的结尾递增计数器的值,
直到达到指定值为止。此时,件条表达式的返回值不再为 true,且循环结束。
求 1 + 2+ 3+…+100 的和
新建一个 FLASH 文档,在第一帧打开动作面板,输入下列代码:
var i = 1;
var sum = 0;
while (i<=100) {
sum += i;
i++;
}
trace(sum)
代码执行过程:
在上面的循环程序中,变量 i 的初始值是 1,表达式 i<=100 为真,变量 sum 加上 1,然
后 i+1 等于 2。再进行 i<=100 的判断,条件真,sum 再加上 2,i 又加上 2 等于 3,这样
循环执行,i 一直自加到 101,此时条件 i<=100 为假,结束循环。这样程序共进行了 100
次判断,也就是进行了 100 次循环,100 次执行表达式 sum+=i,这样就算出了 1+2+3+…
+100 和。
注意:在循环结构中,应该有使循环趋于结束的语句,在本例的代码中,用变量 i 来控制,
i 不断递加到 101,使条件为假,结束循环。
在前面我们知道 enterFrame 事件也是循环执行的,但是循环结构的执行要快行多,我们通
过下面的小程控来测试 while语句的执行速度:
var t = getTimer()/1000;//开始时间以秒为单位
var i = 0;
while (i<1000) {
i++
}//进行 100 次循环
trace(getTimer()/1000-t+"秒");
//结束时间减去开始时间,即循环所需时间.
用 while语句优化代码
大家还记得在第十四课中我们用加法赋值作了一个鼠标跟随效果, 当时每个字我们都要分别
设置它的_x 和_y。如果有 10个字就要写 20 行语句,如果 100 个字呢,那不是就很麻烦
吗?我们用 while就可以把代码优化了。
打开第十四课鼠标跟随特效源文件,把第 1 帧上的代码删除,选中第 1 个字的影片
剪辑元件,打开动作面板,输入代码:
onClipEvent (enter Frame) {
var i = 1;
while (i<=6) {
_root.mc1._x += (_root._xmouse-_x)/5;
_root.mc1._y += (_root._ymouse-_y)/5;
_root["mc"+i]._x += (_root["mc"+(i-1)]._x-_root["mc"+i]._x)/5+8;
_root["mc"+i]._y += (_root["mc"+(i-1)]._y-_root["mc"+i]._y)/5;
i++;
}
}
说明:
(1)如果字的个数增加了,只需改条件即可,例如是 10 个字,那么只需把条件 i<=6 改为
i<=10 就可以了。
(2)由于我们用了 enter Frame事件,所以第 2 帧就可以不要了。
用 while循环实现批量复制影片剪辑
打开源文件,场景第一帧加上代码:
var i = 1;
var num = 5;
while (i<=num) {
attachMovie("qiu", "qiu"+i, i);
_root["qiu"+i]._x = Stage.width/6*i;
_root["qiu"+i]._y = Stage.height/2
_root["qiu"+i+".txt"] = "qiu"+i;
i++;
}
这段代码作用是复制5 个影片剪辑实例,实例名分别为 qiu1、qiu2、qiu3、qiu4、qiu5,并
实现横向等距离排列。要实现同样的交果,代码的写法有很多,如:
var i = 0
var num = 5;
while (i++<num) {
attachMovie("qiu", "qiu"+i, i);
_root["qiu"+i]._x = Stage.width/6*i;
_root["qiu"+i]._y = Stage.height/2;
_root["qiu"+i+".txt"] = "qiu"+i;
}
或者这样写:
var i = 1
var num = 5;
while (i<=num) {
attachMovie("qiu", "qiu"+i++, i);
_root["qiu"+(i-1)]._x = Stage.width/6*(i-1);
_root["qiu"+(i-1)]._y = Stage.height/2;
_root["qiu"+(i-1)+".txt"] = "qiu"+(i-1);
}
dowhile语句:
do while 语句的格式
do {
循环体;
} while(条件表达式)
说明:和 while 循环语句相反,do while 循环语句是一种先斩后奏的循环语句。不管怎样
do{“和”}之间的程序至少要执行一次,然后再判断条件是否要继续循环。如果 while()里
的条件成立,它继续执行 do 里面的程序语句,直到条件不成立为止。其流程图如图用 do while 语句求和
同样的累加问题:1+2+3+…+100,用 do while语句程序为:
var i = 1;
var sum = 0;
do {
sum = sum+i;
i++;
} while (i<=100);
trace(sum);
程序中的 i 不一定只能加 1,可能加上任意数,比如求 100 以内的偶数之和,用这程这样
表示:
var i = 1;
var sum = 0;
do {
sum += i;
} while ((i += 2)<=100);
trace(sum);
区别 whi le与 dowhile 语句
(1) 选中第 1 帧,打开动作面板,输入下列代码;
var i=1
var j=5
(2) 在场景中创建两个按钮实例,分别测试两种语句的结果,两个按钮上的语句分别为;
on (press) {
while (i<j) {
i++;
}
trace(i);
}
on (press) {do {
i++
} while (i<j);
trace(i)
}
(3) 测试影片,不断地单击按钮
从输出面板可以看出,当程序第一次执行时,就是第一次单击按钮时,。结果都是一样,都
是数字 5。 但多单击一次时, while 语句结果还是 5, 而 do while 语句的测试结果不断加 1,
原因是 do while 语句先执行程序, 再进行条件判断, 所以从第二次单击按钮开始, 变量 i 就
加 1。
小结:
while 与 do_while 结构都可以按照一定的条件循环执行循环体,wihle 结构先判定循环条件,
当条件符合时就执行循环体,按顺序执行完循环体中的语句后,在返回 wihle 语句开始处,重新
判定条件,并以此规则进行循环操作,直到循环条件为 false时终止循环,转而执行 wihle 结构
下面的命令,与 wihle 结构不同的是 do_while 循环结构先执行循环体中的语句,然后判定循
环条件.这就是说 do_while循环结构无论条件是否符合,循环至少执行一次.

       二十三、循环语句的嵌套

一个循环体内包含另一个循环体结构,称为循环的嵌套.在这一讲中我们介绍 for 语句的嵌套、for 与while语句的嵌套。

二个for嵌套(乘法九九表)
(1)在舞台上创建一个动态文本,变量名为: “sir”
(2)插入“图层 2”在此第 1 帧输入代码:
var str:String = "";
for (var i = 1; i<=9; i++) {
for (var j = 1; j<=i; j++) {
var k = i*j;
str = str+i+"×"+j+"="+k+(k<10 ? " " : " ")+(j == i ? "\n" : "");
}
}

三个f or嵌套(求水仙花数)
提示:所谓的“水仙花数” ,是指一个三位数,其各位数字的立方和等于该数本身,例如:153 是一个,“水仙花数” ,因为 153 等于 1的立方加上 5 的立方加上 3 的立方。程序如下:
var str:String = "";
var n = 0;
for (var i = 1; i<=9; i++) {
for (var j = 0; j<=9; j++) {
for (var k = 0; k<=9; k++) {
m = i*100+j*10+k;
if(m == i*i*i+j*j*j+k*k*k) {
n++;
str = str+m+(n == 0 ? " " : " ");
}
}
}
}

for语句可以和while语句嵌套使用。(因数分解)
下面我们做一个因数分解的程序。这个实例子 for 语句可以和 while语句嵌套。
(1) 在舞台上创建一个输入文本, 变量名为: “my_txt1” ,再创建一个动态文本, 变量名为: “my_txt2” 。
(2) 创建两个按钮实例,分别用来做分解计算和清空
(3) 添加代码:
“分解”按钮上的代码:
on (release) {
m = Number(my_txt1);
var str:String = m+"=";
var flag = 1;
for (i=2; i<m; i++) {
   while (m%i == 0) {
    if (flag == 1) {
     str = str+""+i;
     flag = 0;
    } else {
     str = str+"×"+i;
    }
    m = m/i;
   }
}
if (m != 1) {
   str = str+"×"+m;
}
my_txt2 = str;
}

清空按钮上的代码:
on (release) {
my_txt1 = "";
my_txt2 = "";
}

嵌套复制
(1)打开素材源文件。
(2)选中复制按钮,打开动作脚本面板,添加代码:
on (release) {
for (i=1; i<=4; i++) {
for (j=1; j<=4; j++) {
duplicateMovieClip("mc", "mc"+i+j, i*4+j);
this["mc"+i+j]._x = (i-1)*100;
this["mc"+i+j]._y = (j-1)*100;
this["mc"+i+j+".txt"] = "mc"+i+j;
}
}
}
(3)选中删除按钮,打开动作在板,添加代码:
on (release) {
for (i=1; i<=4; i++) {
for (j=1; j<=4; j++) {
removeMovieClip("mc"+i+j);
}
}
}
说明:本课中的实例理论性较强,牵涉的数学知识较多

       二十四、组件

组件是拥有已定义了参数的复杂影片剪辑,这些参数在文档创作时设置。通过参数的设置和使用,我们可以修改组件的外观和行为。每个组件都有自己的AS方法,允许我们设置和修改其选项。
    FLASH提供几类组件,它包括数据组件、多媒体组件、UI组件。使用组件时,我们可以使用动作脚本方法添加组件,也可以按下Ctrl+F7组合键打开组件面板。

组件的添加和参数设置
使用组件面板来选择添加组件,按下Ctrl+F7组合键,打开组件面板,将需要的组件拖到场景中。打开属性面板,就可以在属性面板中的参数选项卡中为组件添加参数,并为组件命名和设置组件尺寸及位置。属性面板中的ComboBox组件参数选项卡如图所示







也可以按Alt+F7组合键打开组件检查器,如图所示,我们可以对组件进行设置。


建立ComboBox组件
下面通过使用组件面板来建立组件。
1、按下Ctrl+F7组合键,打开组件面板,选择UI组件类中的ComboBox组件,将它拖入场景中。
2、打开属性面板,在属性面板中的参数选项卡中为组件添加参数。选择labels项,单击labels右面的数据栏,弹出值对话框
3、在值对话框中输入数据项参数。
4、选择rowCount行数项,输入所需要的行数
测试效果


用程序指令控制组件

用程序指令处理组件时事件,有两种方法:一种使用on()函数控制组件,另一种使用Click组件侦听器控制组件。使用on()函数控制组件是FLASH传统的编程思想,容易理解和掌握。使用Click组件侦听器控制组件,是FLASH提倡使用的编程思想,这种方法更符合面向对象的编程特性,程序更安全,功能更强。

使用on()函数控制组件
1、建立组件对象。按下Ctrl+F7组合键,打开组件面板,选择UI组件类中的RadioButton组件,将它拖入场景中。
2、打开属性面板,在属性面板的参数选项卡中为组件添加参数。选择label数据项,在右面的数值栏中输入"选择"
3、对组件进行编程。选中组件,打开动作面板,输入帧指令:
on(click){
trace("选择正确");
}
测试影片,单击"选择"按钮,将在输出面板中输出"选择正确"字样


使用组件侦听器控制组件
将上例中控制组件的on()函数去掉,改为使用组件侦听器控制组件
1、选中场景中的组件,打开属性面板,在属性面板左边,输入组件实例名为"hack"。
2、选择第一帧,输入帧指令:
zt=new Object();//建立侦听器对象
zt.click=function(){
trace("选择正确");
};//为侦听器对象上的click定义一个函数
hack.addEventListener("click",zt);//将组件名为hack的组件注册到侦听对象


组件应用
利用组件制作选择题
1、按下Ctrl+F7组合键,打开组件面板,选择UI组件类中的RadioButton组件,将它拖入场景中。并复制一个RadioButton组件。在场景中建立选择题画面
2、选择左边的RadioButten组件,打开属性面板,在属性面板的参数选项卡中为组件修改参数。

在宽度栏输入60,将该组件的宽度改为60像素宽。

下面我们来解释下该组件的参数作用:
data数据参数:在数据参数栏输入数据15,这个数据将会作为选择题的判断依据。
label标签参数:将标签参数改为"对"。
groupName组名参数:它是很重要的参数,拥有相同组名的单选按钮,同时只能有一个被选中,这样在同一组内就不会出现多个选择。在这个参数栏输入a1。
选择右边的RadioButten组件,在宽度栏同样输入60,将该组件的宽度改成了40像素宽。右边的label标签采纳数栏改成"错",数据栏data中输入数据"13",这个数据将会作为选择题的判断依据,在组名参数栏输入a1

3、选择右下方的文本框,打开属性面板,在左边的文本类型栏中选择动态文本,在文本类型栏下面输入文本框名为"txt"

4、插入新的图层,作为AS层,选中第一帧,输入帧指令:
Listener=new Object();//建立侦听对象
Listener.click=function(hk){//建立侦听对象的click事件函数
if(15==hk.target.selection.data){//判断单选按钮组件中数据栏中的数值是不是等于15
txt.text="选择正确";//如果等于15,将"选择正确"赋予txt文本变量
}else{
txt.text="选择错误";//如果不等于15,将"选择错误"赋予txt文本变量
}
};
a1.addEventListener("click",Listener);//将组名为"a1"的单选按钮注册到侦听对象