flashas菜鸟入门教程下载
作者:
这个教程很老了,是闪吧的 thymecd 发布的 ,由blackhill 整理成chm 图片和 swf都是全的!! 闪吧的下载已经失效了,所以我在网上找了很久总算找了一个下载地址 下面是第三章的内容 很适合刚刚接触as的朋友
ActionScript编程初步
计算机程序是由命令、函数、运算符、条件和循环等结构组成的。命令是为计算机下达的一系列指令,函数执行计算和返回值,通过运算符将若干数据以某种特定的方式结合起来,条件测试一个或多个值以返回一个为true或false的布尔值,循环结构使得程序能够重复执行一系列相同的指令。
变量是存储数据的容器,变量有变量名和变量值。
编程是一项需要耐心的工作,首先你必须理解要用程序解决什么样的问题,然后需要将这个问题分解成若干步骤,将每个步骤再分成更小的步骤,直到每个步骤都小得很容易解决了为止。
程序编写好后,可能会存在许多漏洞或缺陷,所以你还需要对程序进行调试,直到程序能正确运行为止。
3.1 程序基本结构
计算机程序是由命令、函数、运算符、条件和循环等结构组成的。
3.1.1 命令、函数和运算符
在此之前,我们都是用关键字来描述ActionScript中的元素,如关键字gotoAndPlay,它也是一个命令。
命令是ActionScript中用来告诉Flash所要执行的特定操作的元素。之所以称之为命令,就是因为它将被严格的遵照执行,如果要用gotoAndPlay跳转到一个不存在的帧,这样的命令就不能被执行。
命令是程序中最基本的元素,在Flash中如果不使用命令,几乎不能进行任何操作。从本书中你将学到很多命令。
函数是ActionScript中用来执行计算和返回结果的元素。例如,一个特定的函数可以计算并返回一个指定数的平方根。
命令和函数都可以使用参数。参数就是传递给命令或函数的一个值。如gotoAndPlay命令就至少需要一个帧编号或帧标签作为参数。求平方根的函数也需要一个数值作为参数。
与命令和函数不同的是运算符,它们主要是一些符号,而不是字母。例如,+运算符执行两数相加的操作。
在ActionScript程序中你将会用到大量的命令、函数和运算符。
3.1.2 变量
要编写复杂的计算机程序往往需要存储很多的信息。有时你可能只需要存储很短暂的时间,例如,如果需要重复执行10次相同的命令,你就需要对命令的执行次数进行记数,直到满10次为止。
所有的编程语言都使用变量来存储信息。一个变量由两部分构成:变量名和变量的值。
1.变量名
变量名通常是一个单词或几个单词构成的字符串,也可以是一个字母。总的来说,你需要尽可能地为变量指定一个有意义的名称。
例如,如果你要使用变量存储用户的姓名,用userName作为变量名将是一个很好的选择。如果你使用n作变量名,似乎太短了一点;如果使用name,又可能与影片中其他对象的名称相混淆。
在ActionScript中为变量指定变量名时已经形成了一种不成文的规范,就是变量名通常以小写字母开头,当一个新的单词出现时,大写这个新单词的第一个字母,如userName,长一点的例子如currentUserFirstName。
变量名中不允许出现空格,也不允许出现特殊符号,但是可以使用数字。
2.变量类型
你可以用变量存储不同类型的数据。数字是最简单的变量类型。
你可以在变量中存储两种不同类型的数字:整数和浮点数。整数没有小数点部分,如117、-3685都是整数。浮点数有小数点部分,如0.1、532.23、-3.7都是浮点数。
你也可以在变量中存储字符串,字符串就是由字符组成的序列,可以是一个或多个字符,甚至可以没有字符,即空字符串。
使用引号定义字符串,使其与其他变量相区别。如7是一个数字,而“7”则是一个字符串,这个字符串由一个字符7组成。
在别的编程语言中,你可能需要在程序的开头部分提前定义程序中要用到的变量的具体类型,但在ActionScript中不需要预先声明变量,你只需要直接使用它们,Flash在第一次遇到它们的时候会自动为它们创建变量。
另外,变量所能存放的数据类型也没有严格的限定,某一变量可以在一个位置存放字符串,而在另一个位置存放数字。
这种灵活性并不是经常用得到,但是它可以让程序员们少一些不必要的担心。
ActionScript程序员不必担心的另一个问题是废弃变量的空间回收问题。即当你不再需要使用一个变量的时候,你可能需要收回该变量占用的存储空间。大多数现代的计算机语言如ActionScript都可以自动回收空间,所以你也不必担心了。
除数字和字符串类型外还有一些别的变量数据类型。例如,数组可以存放一系列的数据而非单个数据。
3.1.3 条件
程序本身并不能作出抽象的决定,但是它可以获取数据,并对数据进行分析比较,然后根据分析结果执行不同的任务。
例如,你想要检查用户输入的名字并确定其至少包含3个字母。程序需要做的事情就是对用户名作出判断,如果是3个或更多的字母,就执行一种操作;如果不足3个字母则执行另一种操作。
这里,作出一个决定需要两步,第一步是检查条件是否满足,如果名称符合3个字母长度,条件满足,我们称条件的值为真(true);否则条件不满足,我们称条件的值为假(false)。所有的条件都必须是两个值中的一种,要么为真,要么为假。要么为真(true)要么为假(false)的数据类型称为布尔(boolean)类型。
决定的第二步是根据条件为true或为false的情况选择要执行哪些代码。有时只有一个选项,当条件为true时执行该选项;如果条件为false,将不执行任何代码。有时会有两个相对的选项,条件为true和false时分别执行不同的代码。
例如,你想让计算机根据一个变量的值是1、2或3执行3种不同的任务,可以像这样表达:
如果变量的值等于1,执行命令1
如果变量的值等于2,执行命令2
如果变量的值等于3,执行命令3
条件总是建立在比较之上的,你可以比较两个变量的值以判断它们是否相等;或者判断一个是否大于另一个,或是小于另一个。如果变量是字符串类型,你可以比较它们按字典顺序排列时的先后次序。
3.1.4 循环
与人不同,计算机很适合做重复性的工作。一件事情仅仅重复几次就可能使人厌倦,但是让计算机重复执行成千上万次它都照样有耐心。
循环在每种编程语言中都是一个很重要的部分,ActionScript也不例外。你可以指定一条指令执行给定的次数,或者令其执行到满足指定的条件为止。
事实上,条件是循环中的重要组成部分,整个循环只需要一个开始点,一个结束点,再加上一个标志循环结束的条件。
例如,你需要循环10次,使用一个变量从0开始计数。每循环一次,计数加1。当计数变量达到10时,循环结束,程序继续执行循环以后的部分。下面的内容代表了一个标准的循环结构:
(1)循环以前的命令。
(2)循环开始,计数变量置0。
(3)循环中的命令。
(4)计数变量加1。
(5)如果计数变量小于10,执行步骤(3)。
(6)循环以后的命令。
在上面的步骤中,步骤(1)只执行1次,步骤(2)表示循环的开始,步骤(3)、(4)、(5)都将执行10次,当循环结束后,执行步骤(6)及以后的部分。
3.2 ActionScript之一角
当你在编写自己的脚本时,你会用到各种各样不同的关键字和符号,为便于你熟悉脚本的构成,下面先来看一个真实的例子。
这是一段作用于按钮的脚本,当用户单击按钮时(确切地说是松开按下的按钮时)执行它。其中没有包含特殊的函数,但是它体现了ActionScript的主要结构。
on (release) {
var myNumber = 7;
var myString = "Flash MX ActionScript";
for (var i=0; i<myNumber; i++) {
trace(i);
if (i + 3 == 8) {
trace(myString);
}
}
}
脚本的第1行表明当用户松开按下的按钮时执行大括号中的语句。on (release)结构只能用于按钮,其他相关的几种用法如on(press)、on(rollOver)、on(rollout)、on(dragOver)、on(dragOut)等。
第1行末尾的大括号{表示一段相对独立的代码段的开始。从{到与之相对的}之间的代码是一个整体,它们都从属于按钮的release事件。
请注意,大括号之后的代码较之第1行有一个制表符(按一次Tab键)的缩进,其后的每行代码与之具有相同的缩进程度,直到一个新的大括号开始,在新大括号后的语句会比前面的语句增加一个制表符的缩进,以此类推,这种特点与其他编程语言是类似的。Flash会自动将你添加的代码设置成正确的缩进样式。
代码的第1行创建一个名为myNumber的局部变量,并将该变量的值设置为7。下面一行将字符串Flash MX ActionScript赋给另一个变量myString。稍后我们会更详细的介绍变量的两种类型:局部变量和全局变量。
分号;表示一条指令的结束,在每个完整指令的末尾都应该添加分号。
for代表一个循环结构的开始,此处的循环执行7(myNumber)次,即令i从0递增到6,每递增1便执行一次循环结构中的语句。for后面大括号中的部分即为循环体。
命令trace将它后面括号中的内容发送到输出窗口。我们将在下一部分详细介绍输出窗口。
if是一种条件结构,它测试后面的内容i + 3 == 8是否为true,如果为true,则执行后面的语句;否则跳过该代码段。
if结构中只有一个trace命令,它将变量myString的值发送到输出窗口。
上例脚本以三个反向大括号}结束,第1个表示if语句的结束,第2个表示for语句的结束,第3个表示整个on(press)段结束。
3.3 输出窗口
输出窗口是只在测试Flash影片时出现的一个编程工具,Flash用它来显示出错信息或其他的一些重要信息。用户可以用ActionScript中的trace命令自定义要发送到输出窗口中的信息。
输出窗口在测试程序时非常有用。你可以使用trace命令在输出窗口中显示变量的值或者哪一部分ActionScript正在执行。
输出窗口还可以帮助你学习ActionScript。你可以编写一些小程序,将信息发送到输出窗口,这将帮助你看到程序的运行结果。
要想熟悉输出窗口,最好的方法就是多使用它。下面就来编写一段小程序,将信息发送到输出窗口。
(1)启动Flash MX。
(2)选中时间轴的第1帧,打开第1帧的动作面板。
(3)使用右上角的菜单将动作面板切换到专家模式。
(4)在脚本编辑区单击鼠标,将鼠标光标定位到脚本编辑区中。
(5)在动作面板中输入如下ActionScript:
trace("I like ActionScript!");
此时的动作面板如图3-1所示。
图3-1 在动作面板中输入trace命令
(6)按Ctrl+Enter键测试影片,因为舞台中没有任何图像,所以你将看到一个空白窗口,同时出现一个输出窗口,窗口中显示:I like ActionScript!如图3-2所示。
图3-2 输出窗口显示了trace命令中的信息
和动作面板一样,输出窗口右上角也有一个下拉菜单,如图3-3所示,其中包含了拷贝、清除、查找、保存到文件以及打印等命令。
图3-3 输出窗口的下拉菜单
下拉菜单的最后一项命令是“调试级别”,你可以选择“错误”、“警告”、“详细”中的一种,如果选择“无”,将不显示任何信息。
3.4 ActionScript基本语法
前面介绍了程序的基本结构,下面要讲解ActionScript中的基本语法。
3.4.1 变量
1.设置变量
在ActionScript中使用变量的方法很简单,你只需要为变量名分配一个值,例如:
myVariable = 7;
该例在创建名为myVariable的变量的同时将其值设置为7,你可以为变量任意取一个名字,而并不需要使用本例中的myVariable。
可以使用输出窗口查看变量的值,如在一个空白影片第一帧的动作面板中添加如下ActionScript:
x = 7;
trace(x);
首先,数字7被存储在变量x中;然后,使用trace命令将变量x的值发送到输出窗口。影片播放时,输出窗口中会显示数字7。
2.全局变量
根据变量作用的范围不同可将变量分为全局变量和局部变量。
全局变量就是可以作用在整个Flash影片的所有深度级别上的变量。你可以在某一帧中设置它,并在其他帧中使用和改变它的值。
你不需要使用特别的方法创建全局变量,像前一个例子一样,直接设置并使用它,它自动成为一个全局变量。
在许多编程语言中,全局变量可以在任何地方使用。Flash影片使用一个概念叫层级(level)。整修影片的主时间轴作为根(root)层级,影片剪辑是时间轴中的小影片。影片剪辑中的图形和脚本要比根层级低一个级别。影片剪辑不能直接使用根层级中的全局变量。
3.局部变量
局部变量只能存在于当前脚本中,而在其他帧中它将不再存在。你可以在使用同一个变量名在不同的帧中创建不同的局部变量,它们之间将互不影响。
局部变量可用来创建模块化的代码。当前脚本执行完时,局部变量将被从内存中删除;而全局变量将保留到影片结束。
创建局部变量需要使用关键字var。例如,下面的ActionScript创建值为15的局部变量myLocalVariable:
myLocalVariable = 15;
使用var创建局部变量后,在当前代码中就不再需要使用关键字var了。例如,下面的代码创建值为20的局部变量myLocalVariable,然后将其值改为8,再发送到输出窗口中。
var myLocalVariable = 20;
myLocalVariable = 8;
trace(myLocalVariable);
如果没有特殊的需要,请尽量使用局部变量。
3.4.2 比较
在ActionScript中比较两个事物是很容易的,要进行比较可以使用标准的数学符号,如=、<、>等。
1.相等
在ActionScript中用比较运算符对两个值进行比较。
要比较两个值是否相等,可以使用连在一起的两个等于符号(==)。单个等于符号(=)是用来为变量分配值的,并不是比较运算符。
如果要比较变量x的值是否等于7,就可以使用==符号,如下所示:
var x = 7;
trace(x == 7);
以上代码使用=符号将变量x设置为7,然后使用==符号对x和7进行比较。
测试这两行代码,输出窗口将显示“true”。如果将x设置为8或其他数,则会显示“false”。
==符号还可以用来比较两个字符串。如下所示:
var myString = "Hello ActionScript.";
trace(myString == "Hello ActionScript.");
trace(myString == "hello ActionScript.");
程序运行时,你将在输出窗口中看到一个“true”和一个“false”,因为在字符串中字母是要区分大小写的。
如果你要比较两个值是否不等,可以使用!=符号,它的意思是“不等于”。如下所示:
var a = 7;
trace(a != 9);
trace(a != 7);
第1个trace语句显示信息“true”,因为a确实不等于9;第2个trace语句显示信息“false”。
2.小于和大于
使用标准的数学符号<和>比较两数是否成小于或大于关系。举例如下:
var a = 9;
trace(a < 10);
trace(a > 5);
trace(a < 1);
你将从输出窗口中看到“true”、“true”和“false”。
符号<=或>=用于比较一个数是否小于等于或大于等于另一个数,如下所示:
var a = 9;
trace(a <= 9);
trace(a >= 9);
trace(a >= 7);
以上3个trace语句都将显示“true”。
3.4.3 运算
通过运算可以改变变量的值。分别使用算术运算符+、-、*、/执行加、减、乘、除操作。
如下所示的ActionScript将值为9的变量x加上一个数7:
var x = 9;
x = x + 7;
trace(x);
运算结果为16。
在ActionScript中执行运算可以使用一些简写方法,如+=运算符将其前后的值相加并将结果赋给它前面的变量。前面的脚本也可以写成如下的形式:
var x = 9;
x += 7;
trace(x);
++运算符与+=运算符类似,但它每执行一次,变量的值只增加1,如下面的例子:
var x = 9;
x++;
trace(x);
结果显示10。再看下面的例子:
var x = 9;
trace(x++);
trace(x);
结果是9和10。为什么呢?因为第1个trace语句输出x的当前值9,然后将x加1,输出x的新值10。
再试一下下面的脚本:
var x = 9;
trace(++x);
trace(x);
这次的结果为两个10。因为将++运算符置于变量前面,将先执行运算再返回变量的值。
同理,--运算符执行递减操作,-=运算符在变量当前值的基础上减去一个数,*=运算符在变量当前值的基础上乘上一个数,/=运算符在变量当前值的基础上除以一个数。
3.4.4 条件
既然现在你已经知道如何比较两个变量,你就可以将比较结果作为执行某些语句的条件。
1.if语句
if语句使你可以使用比较结果控制Flash影片的播放。如下所示的语句判断X是否等于9,如果比较结果为true,则让影片跳到第15帧:
if (x == 9) {
gotoAndPlay(15);
}
if语句以if开始,其后紧跟一个比较表达式,比较表达式通常用一对括号括起来,再后面即是用大括号括起来当比较结果为true时要执行的代码。
2.else
对if语句可以进行扩展,使用else执行条件不成立(比较表达式为false)时的代码,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else {
gotoAndPlay(16);
}
你也可以使用else if语句将if语句更推进一步,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else if (x == 10) {
gotoAndPlay(16);
} else if (x == 11) {
gotoAndPlay(20);
} else {
gotoAndPlay(25);
}
你可以让if语句想要多长就有多长,你也可以使用else if语句对别的变量进行比较,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else if (y<20) {
gotoAndPlay(16);
} else {
gotoAndPlay(25);
}
3.复合比较
你可以在一个if语句中对几个比较表达式的值进行判断,比如说你希望在x为9并且y为20时跳转到第10帧,可以使用如下所示的脚本:
if ((x == 9) && (y == 20)) {
gotoAndPlay(10);
}
逻辑与运算符&&将两个比较表达式联接在一起成为一个复合表达式,当两个表达式的值都为true时复合表达式的值才为true。每个比较表达式都需要添加独立的括号以便Flash能正确识别。在Flash的早期版本中使用and执行逻辑与运算,现在已推荐不使用。
你也可以使用逻辑或运算符||将两个比较表达式联接在一起成为一个复合表达式,只要有一个表达式的值为true,复合表达式的值就为true。如下所示:
if ((x == 7) || (y == 15)) {
gotoAndPlay(20);
}
在该脚本中,只要x为7或者y为15,或者两者都成立,结果都是跳转到第20帧。只有当两者都不成立时,才不会执行gotoAndPlay命令。在Flash的早期版本中使用or执行逻辑或运算,现在已推荐不使用。
3.4.5 循环
ActionScript中的循环要比if语句稍微复杂一点。它的循环结构与C语言中的循环结构几乎是一致的。
1.for循环结构
for结构是主要的循环结构,其样式如下所示:
for (var i = 0; i<10; i++) {
trace(i);
}
运行这段代码,随着局部变量I的改变,输出窗口中将显示数字0~9。
for结构中关键字for后面的括号中包含3个部分,它们之间用分号隔开。
第1部分声明一个局部变量,在本例中创建了一个局部变量i并将其设置为0。该部分只在循环体开始执行之前执行一次。
第2部分作为一个供测试的条件,在这里,测试i是否小于10。只要满足该条件,就会反复执行循环体。循环开始的时候i等于0,它是小于10的,所以循环得以执行。
第3部分是一个运算表达式,每完成一次循环都将执行该表达式一次。在这里,i每次递增1,然后转到第2部分对i的新值进行判断。
大括号中的部分是该循环的循环体,每执行一次循环都将执行其中的所有命令。我们来看看计算机是如何处理这个循环的。
声明变量i并将其值设为0;
判断条件i<10,结果为true,开始执行循环体;
现在i值为0,trace命令将i值发送到输出窗口,输出窗口显示0;
第1次循环结束,回到循环开始处,i在原来的基础上递增1,i值变为1;
判断条件i<10,结果为true,继续执行循环体;
trace命令将i的值1发送到输出窗口;
然后i再加1,这样循环下去直到执行完10次循环;
回到循环开始处,i在原来的基础上递增1,i值变为10;
判断条件i<10,结果为false,结束循环,开始执行for结构后面的代码。
2.其他形式的循环结构
for循环是最常用的一种循环结构,除for循环之外还有while循环和do…while循环。
while循环的例子如下所示:
i = 0;
while (i != 10) {
trace(i);
i++;
}
while循环看起来似乎要比for循环简单一些,从结构上看甚至与if语句还有一些相似。只要while后面括号中的条件成立,循环就会一直进行下去,所以在while循环体中需要有改变条件的语句,以使条件最终能够为false,完成循环,如上例中的i++。
与while循环相似的是do…while循环,如下所示:
i = 0;
do {
trace(i);
i++;
} while (i != 10);
除了测试条件的位置不同,while循环和do…while循环几乎是一样的。while循环在循环体之前测试条件,do…while循环在循环体之后测试条件,所以do…while循环至少要执行一次,而while循环有可能一次也不执行。
3.跳出循环
所有的循环结构都可以使用两个命令改变循环的执行流程,一个命令是break,另一个命令是continue。break命令终止循环,并跳到循环结构后面的语句处执行;continue命令终止本轮循环但不跳出循环,进而执行下一轮循环。
使用break和continue的例子都比较复杂,另外,还有一种特殊的for…in循环结构,在用到它们的时候我们再详细讲解。
3.4.6 函数
到现在为止,我们都是将脚本放在影片的第1帧中。如果程序相当复杂,再放在同一帧中就使脚本显得太庞大了。
函数使你可以组织需重用的代码,并放在时间轴中,例如:
function myFunction(myNum) {
var newNum = myNum+5;
return newNum;
}
函数以关键字function开头,function后面是函数名。与变量名相似,你可以指定自己的函数名,最好将函数名取得有意义一些。
函数名后面的括号容纳该函数的参数,所谓参数也是一个变量,它的值在调用该函数时予以指定。一个函数可以有若干参数,也可以没有参数。无论有没有参数,函数名后都应紧跟一对括号。
大括号中的部分是函数体,在函数体中创建了一个局部变量newNum,将myNum加5的结果设置为newNum的值。如果你将10作为参数传递给该函数,newNum的值就是15。
return命令仅用于函数中,使用return结束一个函数并返回函数值。此处,newNum是用return命令返回的函数值。
要使用函数,就需要调用它,如下所示:
var a = myFunction(7);
该语句创建一个新的局部变量a,将7作为参数调用函数myFunction,并将函数返回的结果作为变量a的值。
被调用的函数开始运行,创建一个局部变量myNum,将7作为myNum的值,然后执行函数体内的代码,使用return命令将newNum的值12返回给函数的调用者。这时,a的值变为12。
函数最大的作用体现在它可以重复使用。如下所示的3行代码产生3个不同的结果:
trace(myFunction(3));
trace(myFunction(6));
trace(myFunction(8));
运行以上代码,你将得到结果8、11和13。
使用函数还有一个好处就是可以只改变函数中的一处,从而影响所有调用该函数的命令。例如,将函数myFunction中的var newNum = myNum+5改成var newNum = myNum+7,上面3个调用该函数的命令的结果将变成10、13和15
3.4.7 点语法
ActionScript中一个很重要的概念是点语法。点语法也是很多面向对象的编程语言中用来组织对象和函数的方法。
假设你想求一个数的绝对值,Flash中有一个内置的绝对值函数,它包含在ActionScript的“对象”/“核心”/“Math”/“方法”中。要使用绝对值函数,首先要使用对象名,即Math,然后是方法名abs,它们之间用符号“.”隔开,具体表示方法如下所示:
var a = Math.abs(-7);
点语法的另一个用途是指定影片剪辑的属性。如下面的语句将影片剪辑myMC的_alpha(透明度)属性设置为50%:
myMC._alpha = 50;
你还可以在影片剪辑中使用点语法定位根(root)中的一个全局变量。如果你在主时间轴中创建了一个全局变量globelVar,而要在影片剪辑中使用这个全局变量,可以使用如下的语句:
trace(_root.globleVar);
如果你现在对对象、影片剪辑属性、层级之类的概念还不熟悉,不用着急,在以后的内容中我们将对它们进行更深入的讲解。
3.4.8 注释
我们可以在Flash的动作面板中添加注释,注释就是程序中并不参与执行的那些代码。它可以用来提醒你某些代码的作用,方便你组织和编写脚本。一个注释的例子如下所示:
// 将影片剪辑myMC的透明度设置为50%
myMC._alpha = 50;
该例的第1行是注释,注释以双斜线//开头,在//后面你可以输入任意的文本和符号,Flash会自动将注释部分用灰色标示。
上例是将注释专门放在一行中,你也可以将注释放在一行代码的后面,如下所示:
myMC._alpha = 50; // 将影片剪辑myMC的透明度设置为50%
只要使用//符号,Flash就会忽略它后面的部分。
3.5 调试脚本
无论在编写程序时有多么细心,每个程序员都避免不了要调试程序。要学好ActionScript,你就得熟练掌握调试程序的方法。在Flash MX中调试程序有3种方法:逻辑推断、向输出窗口发送信息和使用脚本调试器。
3.5.1 逻辑推断
许多程序错误其实很简单,也很容易解决,并不需要专门的调试工具。当程序出现错误时,你应对错误出现在哪里有一个大致的把握。
就算你不知道问题出在哪里,但通过细心阅读代码,你也有可能找到它。你可以思考一下,你要实现的效果是什么?现在的效果与你的设想有多大差距?是什么原因造成了这种差距?修改哪些部分有望改正这种错误?经过反复思考、修改和调试,你对程序的理解就会不断加深,你的程序也会越来越趋于正确。
没有人比你更了解你自己的程序,所以对你来说,你编写的程序最先宜采用逻辑推断的方法进行调试。还有一些错误或漏洞隐藏得比较深,这就需要借助于调试工具。
3.5.2 输出窗口
输出窗口是一个简单而实用的调试工具,在程序中可以使用trace命令将特定的信息发送到输出窗口中,这些信息可以帮助你了解代码的运行情况。
前面我们已经介绍过输出窗口,这里就不再赘述了。
3.5.3 调试器
调试器是一个更专业的调试工具,它是Flash MX中的一个窗口,通过调试器可以查看影片中的各种数据以及ActionScript代码的运行情况。
选择“控制”→“调试影片”命令,或按快捷键Ctrl+Shift+Enter,开始调试影片。与测试影片不同的是,调试影片时多了一个调试器窗口,如图3-4所示。
图3-4 调试器窗口
调试器窗口中包含很多窗格,在左边的窗格中可以检查Flash影片中不同类型的对象,右边的窗格显示影片中所有的ActionScript。
在调试器窗口中可以设置断点,断点即是为某行代码添加的一个标记,当调试影片时,影片会自动在断点处停止,允许你查看当前包括变量值在内的的影片状态。使用断点可以使你逐行地执行代码,对每行代码的运行结果进行观察和分析。
初学ActionScript的时候,你可能并不需要使用调试器;但是当你成长为一名经验丰富的程序员时,你就会发现它对你是非常有用的。
计算机程序是由命令、函数、运算符、条件和循环等结构组成的。命令是为计算机下达的一系列指令,函数执行计算和返回值,通过运算符将若干数据以某种特定的方式结合起来,条件测试一个或多个值以返回一个为true或false的布尔值,循环结构使得程序能够重复执行一系列相同的指令。
变量是存储数据的容器,变量有变量名和变量值。
编程是一项需要耐心的工作,首先你必须理解要用程序解决什么样的问题,然后需要将这个问题分解成若干步骤,将每个步骤再分成更小的步骤,直到每个步骤都小得很容易解决了为止。
程序编写好后,可能会存在许多漏洞或缺陷,所以你还需要对程序进行调试,直到程序能正确运行为止。
3.1 程序基本结构
计算机程序是由命令、函数、运算符、条件和循环等结构组成的。
3.1.1 命令、函数和运算符
在此之前,我们都是用关键字来描述ActionScript中的元素,如关键字gotoAndPlay,它也是一个命令。
命令是ActionScript中用来告诉Flash所要执行的特定操作的元素。之所以称之为命令,就是因为它将被严格的遵照执行,如果要用gotoAndPlay跳转到一个不存在的帧,这样的命令就不能被执行。
命令是程序中最基本的元素,在Flash中如果不使用命令,几乎不能进行任何操作。从本书中你将学到很多命令。
函数是ActionScript中用来执行计算和返回结果的元素。例如,一个特定的函数可以计算并返回一个指定数的平方根。
命令和函数都可以使用参数。参数就是传递给命令或函数的一个值。如gotoAndPlay命令就至少需要一个帧编号或帧标签作为参数。求平方根的函数也需要一个数值作为参数。
与命令和函数不同的是运算符,它们主要是一些符号,而不是字母。例如,+运算符执行两数相加的操作。
在ActionScript程序中你将会用到大量的命令、函数和运算符。
3.1.2 变量
要编写复杂的计算机程序往往需要存储很多的信息。有时你可能只需要存储很短暂的时间,例如,如果需要重复执行10次相同的命令,你就需要对命令的执行次数进行记数,直到满10次为止。
所有的编程语言都使用变量来存储信息。一个变量由两部分构成:变量名和变量的值。
1.变量名
变量名通常是一个单词或几个单词构成的字符串,也可以是一个字母。总的来说,你需要尽可能地为变量指定一个有意义的名称。
例如,如果你要使用变量存储用户的姓名,用userName作为变量名将是一个很好的选择。如果你使用n作变量名,似乎太短了一点;如果使用name,又可能与影片中其他对象的名称相混淆。
在ActionScript中为变量指定变量名时已经形成了一种不成文的规范,就是变量名通常以小写字母开头,当一个新的单词出现时,大写这个新单词的第一个字母,如userName,长一点的例子如currentUserFirstName。
变量名中不允许出现空格,也不允许出现特殊符号,但是可以使用数字。
2.变量类型
你可以用变量存储不同类型的数据。数字是最简单的变量类型。
你可以在变量中存储两种不同类型的数字:整数和浮点数。整数没有小数点部分,如117、-3685都是整数。浮点数有小数点部分,如0.1、532.23、-3.7都是浮点数。
你也可以在变量中存储字符串,字符串就是由字符组成的序列,可以是一个或多个字符,甚至可以没有字符,即空字符串。
使用引号定义字符串,使其与其他变量相区别。如7是一个数字,而“7”则是一个字符串,这个字符串由一个字符7组成。
在别的编程语言中,你可能需要在程序的开头部分提前定义程序中要用到的变量的具体类型,但在ActionScript中不需要预先声明变量,你只需要直接使用它们,Flash在第一次遇到它们的时候会自动为它们创建变量。
另外,变量所能存放的数据类型也没有严格的限定,某一变量可以在一个位置存放字符串,而在另一个位置存放数字。
这种灵活性并不是经常用得到,但是它可以让程序员们少一些不必要的担心。
ActionScript程序员不必担心的另一个问题是废弃变量的空间回收问题。即当你不再需要使用一个变量的时候,你可能需要收回该变量占用的存储空间。大多数现代的计算机语言如ActionScript都可以自动回收空间,所以你也不必担心了。
除数字和字符串类型外还有一些别的变量数据类型。例如,数组可以存放一系列的数据而非单个数据。
3.1.3 条件
程序本身并不能作出抽象的决定,但是它可以获取数据,并对数据进行分析比较,然后根据分析结果执行不同的任务。
例如,你想要检查用户输入的名字并确定其至少包含3个字母。程序需要做的事情就是对用户名作出判断,如果是3个或更多的字母,就执行一种操作;如果不足3个字母则执行另一种操作。
这里,作出一个决定需要两步,第一步是检查条件是否满足,如果名称符合3个字母长度,条件满足,我们称条件的值为真(true);否则条件不满足,我们称条件的值为假(false)。所有的条件都必须是两个值中的一种,要么为真,要么为假。要么为真(true)要么为假(false)的数据类型称为布尔(boolean)类型。
决定的第二步是根据条件为true或为false的情况选择要执行哪些代码。有时只有一个选项,当条件为true时执行该选项;如果条件为false,将不执行任何代码。有时会有两个相对的选项,条件为true和false时分别执行不同的代码。
例如,你想让计算机根据一个变量的值是1、2或3执行3种不同的任务,可以像这样表达:
如果变量的值等于1,执行命令1
如果变量的值等于2,执行命令2
如果变量的值等于3,执行命令3
条件总是建立在比较之上的,你可以比较两个变量的值以判断它们是否相等;或者判断一个是否大于另一个,或是小于另一个。如果变量是字符串类型,你可以比较它们按字典顺序排列时的先后次序。
3.1.4 循环
与人不同,计算机很适合做重复性的工作。一件事情仅仅重复几次就可能使人厌倦,但是让计算机重复执行成千上万次它都照样有耐心。
循环在每种编程语言中都是一个很重要的部分,ActionScript也不例外。你可以指定一条指令执行给定的次数,或者令其执行到满足指定的条件为止。
事实上,条件是循环中的重要组成部分,整个循环只需要一个开始点,一个结束点,再加上一个标志循环结束的条件。
例如,你需要循环10次,使用一个变量从0开始计数。每循环一次,计数加1。当计数变量达到10时,循环结束,程序继续执行循环以后的部分。下面的内容代表了一个标准的循环结构:
(1)循环以前的命令。
(2)循环开始,计数变量置0。
(3)循环中的命令。
(4)计数变量加1。
(5)如果计数变量小于10,执行步骤(3)。
(6)循环以后的命令。
在上面的步骤中,步骤(1)只执行1次,步骤(2)表示循环的开始,步骤(3)、(4)、(5)都将执行10次,当循环结束后,执行步骤(6)及以后的部分。
3.2 ActionScript之一角
当你在编写自己的脚本时,你会用到各种各样不同的关键字和符号,为便于你熟悉脚本的构成,下面先来看一个真实的例子。
这是一段作用于按钮的脚本,当用户单击按钮时(确切地说是松开按下的按钮时)执行它。其中没有包含特殊的函数,但是它体现了ActionScript的主要结构。
on (release) {
var myNumber = 7;
var myString = "Flash MX ActionScript";
for (var i=0; i<myNumber; i++) {
trace(i);
if (i + 3 == 8) {
trace(myString);
}
}
}
脚本的第1行表明当用户松开按下的按钮时执行大括号中的语句。on (release)结构只能用于按钮,其他相关的几种用法如on(press)、on(rollOver)、on(rollout)、on(dragOver)、on(dragOut)等。
第1行末尾的大括号{表示一段相对独立的代码段的开始。从{到与之相对的}之间的代码是一个整体,它们都从属于按钮的release事件。
请注意,大括号之后的代码较之第1行有一个制表符(按一次Tab键)的缩进,其后的每行代码与之具有相同的缩进程度,直到一个新的大括号开始,在新大括号后的语句会比前面的语句增加一个制表符的缩进,以此类推,这种特点与其他编程语言是类似的。Flash会自动将你添加的代码设置成正确的缩进样式。
代码的第1行创建一个名为myNumber的局部变量,并将该变量的值设置为7。下面一行将字符串Flash MX ActionScript赋给另一个变量myString。稍后我们会更详细的介绍变量的两种类型:局部变量和全局变量。
分号;表示一条指令的结束,在每个完整指令的末尾都应该添加分号。
for代表一个循环结构的开始,此处的循环执行7(myNumber)次,即令i从0递增到6,每递增1便执行一次循环结构中的语句。for后面大括号中的部分即为循环体。
命令trace将它后面括号中的内容发送到输出窗口。我们将在下一部分详细介绍输出窗口。
if是一种条件结构,它测试后面的内容i + 3 == 8是否为true,如果为true,则执行后面的语句;否则跳过该代码段。
if结构中只有一个trace命令,它将变量myString的值发送到输出窗口。
上例脚本以三个反向大括号}结束,第1个表示if语句的结束,第2个表示for语句的结束,第3个表示整个on(press)段结束。
3.3 输出窗口
输出窗口是只在测试Flash影片时出现的一个编程工具,Flash用它来显示出错信息或其他的一些重要信息。用户可以用ActionScript中的trace命令自定义要发送到输出窗口中的信息。
输出窗口在测试程序时非常有用。你可以使用trace命令在输出窗口中显示变量的值或者哪一部分ActionScript正在执行。
输出窗口还可以帮助你学习ActionScript。你可以编写一些小程序,将信息发送到输出窗口,这将帮助你看到程序的运行结果。
要想熟悉输出窗口,最好的方法就是多使用它。下面就来编写一段小程序,将信息发送到输出窗口。
(1)启动Flash MX。
(2)选中时间轴的第1帧,打开第1帧的动作面板。
(3)使用右上角的菜单将动作面板切换到专家模式。
(4)在脚本编辑区单击鼠标,将鼠标光标定位到脚本编辑区中。
(5)在动作面板中输入如下ActionScript:
trace("I like ActionScript!");
此时的动作面板如图3-1所示。
图3-1 在动作面板中输入trace命令
(6)按Ctrl+Enter键测试影片,因为舞台中没有任何图像,所以你将看到一个空白窗口,同时出现一个输出窗口,窗口中显示:I like ActionScript!如图3-2所示。
图3-2 输出窗口显示了trace命令中的信息
和动作面板一样,输出窗口右上角也有一个下拉菜单,如图3-3所示,其中包含了拷贝、清除、查找、保存到文件以及打印等命令。
图3-3 输出窗口的下拉菜单
下拉菜单的最后一项命令是“调试级别”,你可以选择“错误”、“警告”、“详细”中的一种,如果选择“无”,将不显示任何信息。
3.4 ActionScript基本语法
前面介绍了程序的基本结构,下面要讲解ActionScript中的基本语法。
3.4.1 变量
1.设置变量
在ActionScript中使用变量的方法很简单,你只需要为变量名分配一个值,例如:
myVariable = 7;
该例在创建名为myVariable的变量的同时将其值设置为7,你可以为变量任意取一个名字,而并不需要使用本例中的myVariable。
可以使用输出窗口查看变量的值,如在一个空白影片第一帧的动作面板中添加如下ActionScript:
x = 7;
trace(x);
首先,数字7被存储在变量x中;然后,使用trace命令将变量x的值发送到输出窗口。影片播放时,输出窗口中会显示数字7。
2.全局变量
根据变量作用的范围不同可将变量分为全局变量和局部变量。
全局变量就是可以作用在整个Flash影片的所有深度级别上的变量。你可以在某一帧中设置它,并在其他帧中使用和改变它的值。
你不需要使用特别的方法创建全局变量,像前一个例子一样,直接设置并使用它,它自动成为一个全局变量。
在许多编程语言中,全局变量可以在任何地方使用。Flash影片使用一个概念叫层级(level)。整修影片的主时间轴作为根(root)层级,影片剪辑是时间轴中的小影片。影片剪辑中的图形和脚本要比根层级低一个级别。影片剪辑不能直接使用根层级中的全局变量。
3.局部变量
局部变量只能存在于当前脚本中,而在其他帧中它将不再存在。你可以在使用同一个变量名在不同的帧中创建不同的局部变量,它们之间将互不影响。
局部变量可用来创建模块化的代码。当前脚本执行完时,局部变量将被从内存中删除;而全局变量将保留到影片结束。
创建局部变量需要使用关键字var。例如,下面的ActionScript创建值为15的局部变量myLocalVariable:
myLocalVariable = 15;
使用var创建局部变量后,在当前代码中就不再需要使用关键字var了。例如,下面的代码创建值为20的局部变量myLocalVariable,然后将其值改为8,再发送到输出窗口中。
var myLocalVariable = 20;
myLocalVariable = 8;
trace(myLocalVariable);
如果没有特殊的需要,请尽量使用局部变量。
3.4.2 比较
在ActionScript中比较两个事物是很容易的,要进行比较可以使用标准的数学符号,如=、<、>等。
1.相等
在ActionScript中用比较运算符对两个值进行比较。
要比较两个值是否相等,可以使用连在一起的两个等于符号(==)。单个等于符号(=)是用来为变量分配值的,并不是比较运算符。
如果要比较变量x的值是否等于7,就可以使用==符号,如下所示:
var x = 7;
trace(x == 7);
以上代码使用=符号将变量x设置为7,然后使用==符号对x和7进行比较。
测试这两行代码,输出窗口将显示“true”。如果将x设置为8或其他数,则会显示“false”。
==符号还可以用来比较两个字符串。如下所示:
var myString = "Hello ActionScript.";
trace(myString == "Hello ActionScript.");
trace(myString == "hello ActionScript.");
程序运行时,你将在输出窗口中看到一个“true”和一个“false”,因为在字符串中字母是要区分大小写的。
如果你要比较两个值是否不等,可以使用!=符号,它的意思是“不等于”。如下所示:
var a = 7;
trace(a != 9);
trace(a != 7);
第1个trace语句显示信息“true”,因为a确实不等于9;第2个trace语句显示信息“false”。
2.小于和大于
使用标准的数学符号<和>比较两数是否成小于或大于关系。举例如下:
var a = 9;
trace(a < 10);
trace(a > 5);
trace(a < 1);
你将从输出窗口中看到“true”、“true”和“false”。
符号<=或>=用于比较一个数是否小于等于或大于等于另一个数,如下所示:
var a = 9;
trace(a <= 9);
trace(a >= 9);
trace(a >= 7);
以上3个trace语句都将显示“true”。
3.4.3 运算
通过运算可以改变变量的值。分别使用算术运算符+、-、*、/执行加、减、乘、除操作。
如下所示的ActionScript将值为9的变量x加上一个数7:
var x = 9;
x = x + 7;
trace(x);
运算结果为16。
在ActionScript中执行运算可以使用一些简写方法,如+=运算符将其前后的值相加并将结果赋给它前面的变量。前面的脚本也可以写成如下的形式:
var x = 9;
x += 7;
trace(x);
++运算符与+=运算符类似,但它每执行一次,变量的值只增加1,如下面的例子:
var x = 9;
x++;
trace(x);
结果显示10。再看下面的例子:
var x = 9;
trace(x++);
trace(x);
结果是9和10。为什么呢?因为第1个trace语句输出x的当前值9,然后将x加1,输出x的新值10。
再试一下下面的脚本:
var x = 9;
trace(++x);
trace(x);
这次的结果为两个10。因为将++运算符置于变量前面,将先执行运算再返回变量的值。
同理,--运算符执行递减操作,-=运算符在变量当前值的基础上减去一个数,*=运算符在变量当前值的基础上乘上一个数,/=运算符在变量当前值的基础上除以一个数。
3.4.4 条件
既然现在你已经知道如何比较两个变量,你就可以将比较结果作为执行某些语句的条件。
1.if语句
if语句使你可以使用比较结果控制Flash影片的播放。如下所示的语句判断X是否等于9,如果比较结果为true,则让影片跳到第15帧:
if (x == 9) {
gotoAndPlay(15);
}
if语句以if开始,其后紧跟一个比较表达式,比较表达式通常用一对括号括起来,再后面即是用大括号括起来当比较结果为true时要执行的代码。
2.else
对if语句可以进行扩展,使用else执行条件不成立(比较表达式为false)时的代码,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else {
gotoAndPlay(16);
}
你也可以使用else if语句将if语句更推进一步,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else if (x == 10) {
gotoAndPlay(16);
} else if (x == 11) {
gotoAndPlay(20);
} else {
gotoAndPlay(25);
}
你可以让if语句想要多长就有多长,你也可以使用else if语句对别的变量进行比较,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else if (y<20) {
gotoAndPlay(16);
} else {
gotoAndPlay(25);
}
3.复合比较
你可以在一个if语句中对几个比较表达式的值进行判断,比如说你希望在x为9并且y为20时跳转到第10帧,可以使用如下所示的脚本:
if ((x == 9) && (y == 20)) {
gotoAndPlay(10);
}
逻辑与运算符&&将两个比较表达式联接在一起成为一个复合表达式,当两个表达式的值都为true时复合表达式的值才为true。每个比较表达式都需要添加独立的括号以便Flash能正确识别。在Flash的早期版本中使用and执行逻辑与运算,现在已推荐不使用。
你也可以使用逻辑或运算符||将两个比较表达式联接在一起成为一个复合表达式,只要有一个表达式的值为true,复合表达式的值就为true。如下所示:
if ((x == 7) || (y == 15)) {
gotoAndPlay(20);
}
在该脚本中,只要x为7或者y为15,或者两者都成立,结果都是跳转到第20帧。只有当两者都不成立时,才不会执行gotoAndPlay命令。在Flash的早期版本中使用or执行逻辑或运算,现在已推荐不使用。
3.4.5 循环
ActionScript中的循环要比if语句稍微复杂一点。它的循环结构与C语言中的循环结构几乎是一致的。
1.for循环结构
for结构是主要的循环结构,其样式如下所示:
for (var i = 0; i<10; i++) {
trace(i);
}
运行这段代码,随着局部变量I的改变,输出窗口中将显示数字0~9。
for结构中关键字for后面的括号中包含3个部分,它们之间用分号隔开。
第1部分声明一个局部变量,在本例中创建了一个局部变量i并将其设置为0。该部分只在循环体开始执行之前执行一次。
第2部分作为一个供测试的条件,在这里,测试i是否小于10。只要满足该条件,就会反复执行循环体。循环开始的时候i等于0,它是小于10的,所以循环得以执行。
第3部分是一个运算表达式,每完成一次循环都将执行该表达式一次。在这里,i每次递增1,然后转到第2部分对i的新值进行判断。
大括号中的部分是该循环的循环体,每执行一次循环都将执行其中的所有命令。我们来看看计算机是如何处理这个循环的。
声明变量i并将其值设为0;
判断条件i<10,结果为true,开始执行循环体;
现在i值为0,trace命令将i值发送到输出窗口,输出窗口显示0;
第1次循环结束,回到循环开始处,i在原来的基础上递增1,i值变为1;
判断条件i<10,结果为true,继续执行循环体;
trace命令将i的值1发送到输出窗口;
然后i再加1,这样循环下去直到执行完10次循环;
回到循环开始处,i在原来的基础上递增1,i值变为10;
判断条件i<10,结果为false,结束循环,开始执行for结构后面的代码。
2.其他形式的循环结构
for循环是最常用的一种循环结构,除for循环之外还有while循环和do…while循环。
while循环的例子如下所示:
i = 0;
while (i != 10) {
trace(i);
i++;
}
while循环看起来似乎要比for循环简单一些,从结构上看甚至与if语句还有一些相似。只要while后面括号中的条件成立,循环就会一直进行下去,所以在while循环体中需要有改变条件的语句,以使条件最终能够为false,完成循环,如上例中的i++。
与while循环相似的是do…while循环,如下所示:
i = 0;
do {
trace(i);
i++;
} while (i != 10);
除了测试条件的位置不同,while循环和do…while循环几乎是一样的。while循环在循环体之前测试条件,do…while循环在循环体之后测试条件,所以do…while循环至少要执行一次,而while循环有可能一次也不执行。
3.跳出循环
所有的循环结构都可以使用两个命令改变循环的执行流程,一个命令是break,另一个命令是continue。break命令终止循环,并跳到循环结构后面的语句处执行;continue命令终止本轮循环但不跳出循环,进而执行下一轮循环。
使用break和continue的例子都比较复杂,另外,还有一种特殊的for…in循环结构,在用到它们的时候我们再详细讲解。
3.4.6 函数
到现在为止,我们都是将脚本放在影片的第1帧中。如果程序相当复杂,再放在同一帧中就使脚本显得太庞大了。
函数使你可以组织需重用的代码,并放在时间轴中,例如:
function myFunction(myNum) {
var newNum = myNum+5;
return newNum;
}
函数以关键字function开头,function后面是函数名。与变量名相似,你可以指定自己的函数名,最好将函数名取得有意义一些。
函数名后面的括号容纳该函数的参数,所谓参数也是一个变量,它的值在调用该函数时予以指定。一个函数可以有若干参数,也可以没有参数。无论有没有参数,函数名后都应紧跟一对括号。
大括号中的部分是函数体,在函数体中创建了一个局部变量newNum,将myNum加5的结果设置为newNum的值。如果你将10作为参数传递给该函数,newNum的值就是15。
return命令仅用于函数中,使用return结束一个函数并返回函数值。此处,newNum是用return命令返回的函数值。
要使用函数,就需要调用它,如下所示:
var a = myFunction(7);
该语句创建一个新的局部变量a,将7作为参数调用函数myFunction,并将函数返回的结果作为变量a的值。
被调用的函数开始运行,创建一个局部变量myNum,将7作为myNum的值,然后执行函数体内的代码,使用return命令将newNum的值12返回给函数的调用者。这时,a的值变为12。
函数最大的作用体现在它可以重复使用。如下所示的3行代码产生3个不同的结果:
trace(myFunction(3));
trace(myFunction(6));
trace(myFunction(8));
运行以上代码,你将得到结果8、11和13。
使用函数还有一个好处就是可以只改变函数中的一处,从而影响所有调用该函数的命令。例如,将函数myFunction中的var newNum = myNum+5改成var newNum = myNum+7,上面3个调用该函数的命令的结果将变成10、13和15
3.4.7 点语法
ActionScript中一个很重要的概念是点语法。点语法也是很多面向对象的编程语言中用来组织对象和函数的方法。
假设你想求一个数的绝对值,Flash中有一个内置的绝对值函数,它包含在ActionScript的“对象”/“核心”/“Math”/“方法”中。要使用绝对值函数,首先要使用对象名,即Math,然后是方法名abs,它们之间用符号“.”隔开,具体表示方法如下所示:
var a = Math.abs(-7);
点语法的另一个用途是指定影片剪辑的属性。如下面的语句将影片剪辑myMC的_alpha(透明度)属性设置为50%:
myMC._alpha = 50;
你还可以在影片剪辑中使用点语法定位根(root)中的一个全局变量。如果你在主时间轴中创建了一个全局变量globelVar,而要在影片剪辑中使用这个全局变量,可以使用如下的语句:
trace(_root.globleVar);
如果你现在对对象、影片剪辑属性、层级之类的概念还不熟悉,不用着急,在以后的内容中我们将对它们进行更深入的讲解。
3.4.8 注释
我们可以在Flash的动作面板中添加注释,注释就是程序中并不参与执行的那些代码。它可以用来提醒你某些代码的作用,方便你组织和编写脚本。一个注释的例子如下所示:
// 将影片剪辑myMC的透明度设置为50%
myMC._alpha = 50;
该例的第1行是注释,注释以双斜线//开头,在//后面你可以输入任意的文本和符号,Flash会自动将注释部分用灰色标示。
上例是将注释专门放在一行中,你也可以将注释放在一行代码的后面,如下所示:
myMC._alpha = 50; // 将影片剪辑myMC的透明度设置为50%
只要使用//符号,Flash就会忽略它后面的部分。
3.5 调试脚本
无论在编写程序时有多么细心,每个程序员都避免不了要调试程序。要学好ActionScript,你就得熟练掌握调试程序的方法。在Flash MX中调试程序有3种方法:逻辑推断、向输出窗口发送信息和使用脚本调试器。
3.5.1 逻辑推断
许多程序错误其实很简单,也很容易解决,并不需要专门的调试工具。当程序出现错误时,你应对错误出现在哪里有一个大致的把握。
就算你不知道问题出在哪里,但通过细心阅读代码,你也有可能找到它。你可以思考一下,你要实现的效果是什么?现在的效果与你的设想有多大差距?是什么原因造成了这种差距?修改哪些部分有望改正这种错误?经过反复思考、修改和调试,你对程序的理解就会不断加深,你的程序也会越来越趋于正确。
没有人比你更了解你自己的程序,所以对你来说,你编写的程序最先宜采用逻辑推断的方法进行调试。还有一些错误或漏洞隐藏得比较深,这就需要借助于调试工具。
3.5.2 输出窗口
输出窗口是一个简单而实用的调试工具,在程序中可以使用trace命令将特定的信息发送到输出窗口中,这些信息可以帮助你了解代码的运行情况。
前面我们已经介绍过输出窗口,这里就不再赘述了。
3.5.3 调试器
调试器是一个更专业的调试工具,它是Flash MX中的一个窗口,通过调试器可以查看影片中的各种数据以及ActionScript代码的运行情况。
选择“控制”→“调试影片”命令,或按快捷键Ctrl+Shift+Enter,开始调试影片。与测试影片不同的是,调试影片时多了一个调试器窗口,如图3-4所示。
图3-4 调试器窗口
调试器窗口中包含很多窗格,在左边的窗格中可以检查Flash影片中不同类型的对象,右边的窗格显示影片中所有的ActionScript。
在调试器窗口中可以设置断点,断点即是为某行代码添加的一个标记,当调试影片时,影片会自动在断点处停止,允许你查看当前包括变量值在内的的影片状态。使用断点可以使你逐行地执行代码,对每行代码的运行结果进行观察和分析。
初学ActionScript的时候,你可能并不需要使用调试器;但是当你成长为一名经验丰富的程序员时,你就会发现它对你是非常有用的。