2023年Flash编程基础言简意赅适合新人没有基础也能看懂啊_第1页
2023年Flash编程基础言简意赅适合新人没有基础也能看懂啊_第2页
2023年Flash编程基础言简意赅适合新人没有基础也能看懂啊_第3页
2023年Flash编程基础言简意赅适合新人没有基础也能看懂啊_第4页
2023年Flash编程基础言简意赅适合新人没有基础也能看懂啊_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Flash编程基础(言简意赅适合新人没有基础也能看懂啊)教学提纲ActionScript代码的输入与编辑语法与结构错误与调试重点与难点 重点是语法与结构,视课堂讲授的进度安排教学内容。由于安排的内容较多,若课堂上无法所有完毕,则改为回去自学。教学内容:ActionScript代码的输入与编辑Flash是一个集美工、动画与编程于一体的集成开发环境,故而其编程方式与其它纯程序开发的编程方式有所不同。Flash自诞生之日起,就是以美工、动画为主,以程序为辅的应用框架。我们可以理解为,Flash的总体结构就是一个影片剪辑(MovieClip),而几乎所有的多媒体内容都是挂在这个影片剪辑中的某个分支之上,涉及脚本(代码),形成一个树形结构。自ActionScript3.0起,这个框架被规范化为显示对象层次结构。一个典型的Flash作品的结构如下图所示:典型的Flash作品的结构这种以动画为主,代码为辅的程序框架的好处是显而易见的,由于游戏开发的许多工作与画面设计打交道,我们运用对象层次结构,在直观的环境下创作几乎整个游戏!脚本的从属地位的好处显而易见,而其坏处也越来越被人们结识,就是对于其他程序开发人员来说,Flash的脚本有些莫名其妙,要想开发Flash程序,就必须先了解Flash的显示对象层次结构,动画,时间轴等原本与编程无多大联系的知识。目前,Flash界面设计与代码设计的分离成了趋势,例如通过flex等提供一个完全适合程序员的开发环境。由于游戏类型的应用,界面与程序结合非常紧密,所以还是采用原有的框架,在单独的Flash开发环境中完毕所有的工作。虽然Actionscript代码可以被挂在Flash中的许多分支上,但查看和编辑脚本却十分方便,由于所有的代码都在动作面板(脚本编辑器)中输入和编辑,只要用鼠标点击相应的位置或者对象,就会显示这个位置或对象所有用的代码。打开一个Flash文档,按F9键,或者点击【窗口】|【动作】命令,即可打开动作面板。动作面板如下图所示:动作面板由于接下来要经常和动作面板打交道,所以这里对动作面板进行较为具体的介绍。脚本版本选择:点击下拉按钮弹出ActionScript版本列表,选择其中的一个,则语言元素列表的内容会作相应的变化。需要注意的是这里修改的是语言元素列表的显示内容,但本文档的ActionScript版本并不因此而被修改。ActionScript版本选择语言元素列表:这是一个树型结构的目录,它列出了当前版本的语言元素、包以及索引。其中每个包里面有一个或多个类,每个类的属性、方法和事件也都列在树型结构中。如下图所示:语言元素列表双击其中的一个条目,就可以在代码窗口添加一行相应的代码,然后用脚本助手或者直接手动进行必要的修改。当前代码位置:当前代码位置指出脚本编辑器中的代码位于Flash文档的何处。典型的代码放置位置是主时间轴的帧上或者是影片剪辑中的帧上。假如是AS2或更早版本,代码也也许是直接依附在影片剪辑或者按钮上。做法是单击一个剪辑或者按钮,然后打开动作面板,输入或者编辑其上的代码。相信有过Flash8或以前版本使用经验的读者对按钮上的on函数再熟悉但是了。工具栏:动作面板的工具栏给出了针对Flash代码的各种实用的按钮,这些按钮的说明如下图所示:动作面板的工具栏及其解释点击按钮将弹出与语言元素列表内容同样的菜单。点击按钮可以在编译之前查找代码的语法错误,这些错误会在输出窗口中显示。点击可以将代码依据其结构自动缩进对齐,假如代码存在语法错误,则会提醒语法错误,无法套用格式。从起右边的按钮,是FlashCS3新增的。这些按钮和VisualStudio.NET的相关工具类似,估计是汲取其优点而添加的。脚本助手:脚本助手启动时,会在动作面板的上部显示当前行代码的结构信息,提供具体的辅助信息。如图所示,点击for循环语句首行时脚本助手显示的信息:脚本助手启动脚本助手时无法自由修改脚本代码,并且挤占了动作面板许多空间,所以它只适合初学者在不清楚程序结构或者紧张引入语法错误的情况下使用。当读者对ActionScript的语法与结构具有一定的了解之后,应当取消脚本助手,而在代码窗口中自由地编辑代码。语法与结构本章节讲解ActionScript的语法与结构,但并不按教科书的方式具体讲解。而是完全将FlashCS3看作是一种面向对象的编程开发环境,以最简练的代码讲解ActionScript的语法与结构。从简练的代码中引申出来的各种编程概念和知识面,则以列表的方式平铺。这种方法可以使大家运用以前所学的其它语言的编程知识,快速过渡到ActionScript编程上来。第一段示例代码打开FlashCS3Professional,选择【文献】|【新建】,或者按Ctrl+N,弹出新建文档对话框。选择“Flash文档(ActionScript3.0)”,按拟定新建一个Flash文档。点击“图层1”的第1帧,按【F9】弹出动作面板,输入以下代码://这是我第一次写ActionScript脚本varsum:Number;varcount:Number=5;sum=0;for(vari:Number=1;i<=count;i++){ sum=i*(i+1)/2; trace("1累加到"+i+"的值为:"+sum);}如下图所示:第一个脚本注意:下文若提到“输入以下代码”时,就是在新建文档的图层1的第1帧的动作面板中输入下框中的代码。在调试程序前保存文献是一个良好的习惯,由于谁也不能肯定刚刚编写的脚本不会在调试过程中导致死机,若调试过程中出现死机或者意外退出Flash程序,那么没有保存的内容将会丢失。按Ctrl+S保存文献,然后选择【控制】|【测试影片】,或者按Ctrl+Enter测试影片。这时会弹出两个窗口,一个是Flash作品的窗口,由于刚才没有建立任何可见的元素,所以这个窗口是空白的。尚有一个是输出窗口,当有trace输出语句或者出现语法错误的时候就会自动弹出输出窗口。本段程序测试时输出窗口如下图所示:本程序的输出这段代码包含以下知识点:代码注释的语法变量声明与赋值的方法数据类型与默认值显式类型指定及其意义程序结构语句基本数学运算trace语句介绍现在让我们一行行地结识这些代码://这是我第一次写脚本这是一行代码注释,编译器将忽略这行文字。注释提高了代码的可读性。单行注释由“//”开始,在代码中呈灰色。假如需要多行注释,则使用“/*”开始,用“*/”结束。一个典型的多行注释如下所示:/*********************************Boat.as**轮船类**作者:肖刚**********************************/再看本例接下来的两行代码:varsum:Number;varcount:Number=5;这两行代码声明两个数值类型的变量sum和count。var是声明变量的关键字,sum与count是变量名称。Number指出变量数据类型为数值。第二行代码声明变量count的同时赋值一个初始值5。对于面向对象的程序设计语言来说,所有的数据类型都是对象,都是类。Flash的内置类可以分为两种,一种是基元类型,也被成为原始类型,它们一般用来存储一些简朴的数据,有的原始类型还具有一些针对所存储的数据的属性和方法。原始类型是构建复杂类的基本元素。另一种是复杂类,它们是由class关键字定义的类,可以认为是程序的构件,一般具有成套的属性、方法和事件。原始类型的变量直接存储数据,而复杂类型的变量存储的是类的引用。更多的关于类与对象的介绍,请参看“Flash的内置类”以及“面向对象程序设计”章节。下表列出了ActionScript常用的原始类型,以及其简要的说明,它们的用法都是大同小异的:数据类型说明BooleanBoolean数据类型涉及两个值:true和false。对于此类变量,其它任何值都是无效的。已经声明但尚未初始化的布尔变量的默认值是false。Number此数据类型可以表达整数、无符号整数和浮点数。若要存储浮点数,数字中应当涉及一个小数点。若没有小数点,数字将被存储为整数。int存储32位有符号整形数据。使用int类型有助于运用CPU快速解决整形运算的能力。(仅合用于ActionScript3.0)uint存储32位无符号整数的数据。uint类重要用于像素颜色值(ARGB和RGBA)和int数据类型无法很好工作的其它情况。(仅合用于ActionScript3.0)StringString数据类型表达16位字符的序列,也许涉及字母、数字和标点符号。字符串存储为Unicode字符,使用UTF-16格式。对字符串值的操作返回字符串的一个新的实例。默认值假如没有给变量赋值,变量将采用默认值。变量默认值列表如下:数据类型默认值Booleanfalseint0NumberNaNObjectundefinedStringnulluint0未声明(与类型注释*等效)undefined其它所有类(涉及用户定义的类)undefined显式类型指定:双引号“:”是类型(type)运算符,用于显式指定变量的数据类型,与var关键字配合使用。它可以指定变量类型、函数返回类型或函数参数类型。在变量声明或赋值中使用时,此运算符指定变量的类型;在函数声明或定义中使用时,此运算符指定函数的返回类型;在函数定义中与函数参数一起使用时,此运算符指定该参数预期的变量类型。显式指定数据类型不仅仅是一个良好的编程习惯,以便避免运营时出现不匹配情况;同时,对于Flash来说,脚本编辑器支持内置类和基于这些类的变量的代码提醒,从而提高了编程的效率。假如需要为指定的变量的特定对象类型提供代码提醒就要严格指定变量类型,Flash根据变量的类型弹出合适的提醒。代码提醒有两种:弹出菜单提醒和工具提醒样式的语法提醒。弹出菜单提醒如下图所示:弹出菜单提醒由于在之前显式声明了变量today为Date(日期)类型,所以当用键盘敲入“today”然后敲入“.”时,编辑器就会自动列出Date类型的变量的所有属性和方法供我们选择。这大大提高了编程的效率,也减少了由于记忆或者输入错误而引起的程序错误。语法提醒如下图所示:语法提醒语法提醒在使用内置类的成员函数时出现,如上图中我们使用了内置类Date的getFullYear函数时,它会提醒我们这个函数的参数为空,函数的返回值为Number类型。程序的基本结构:继续看接下去的代码:for(vari:Number=1;i<=count;i++){//内部代码略这是一个for循环结构。它的标准格式为:for(表达式1;表达式2;表达式3){内嵌语句}它的执行过程如下:求解表达式1求解表达式2,若其值为真(true),则执行内嵌语句,若为假(false),则转到第(5)步求解表达式3转回上面第(2)步继续执行循环结束,执行for循环以后的过程使用流程图来表达的话,for循环结构的执行如下图所示:for循环结构虽然表达式1到表达式3可以是任意的单条语句,但是最常用的是它们分别表达循环变量赋初始值,循环条件,循环变量增值,例如本例的代码。通常的计算机程序总是由若干条语句组成,从执行方式上看,从第一条语句到最后一条语句完全按顺序执行,是简朴的顺序结构;若在程序执行过程当中,根据用户的输入或中间结果去执行若干不同的任务则为选择结构;假如在程序的某处,需要根据某项条件反复地执行某项任务若干次或直到满足或不满足某条件为止,这就构成循环结构。顺序结构、循环结构、选择结构构成了结构化程序设计的三个基本单元,而众多的基本单元构成庞大的程序。顺序结构的流程图如下所示:顺序结构典型的选择结构的流程图如下所示:典型选择结构按顺序编写的语句即为顺序结构,所以没有结构语句,而循环结构和选择结构分别有多种语句结构,这些结构如下表所示:结构类型语句以及语法说明循环结构for(初始值;条件;增值){语句}先赋初始值,然后判断条件,为真的情况下执行语句,然后增值,完毕一次循环,接着重新判断条件,直到条件为假。for(变量in对象){语句}顺序遍历对象的属性或数组中的元素,并对每个属性或元素执行语句。while(条件){语句}当条件为真时执行语句,然后判断条件,假如为真,执行语句,重新判断条件,直到条件为假。do{语句}while(条件);先执行语句,然后判断条件,假如为真,继续执行语句。选择结构if(条件){语句}判断条件,假如为真,则执行语句。if(条件){语句1}else{语句2}判断条件,假如为真,执行语句1,否则,执行语句2。if(条件1){语句1}elseif(条件2){语句2}判断条件1,假如为真,则执行语句1,否则假如条件2为真,则执行语句2。switch(变量){case值1:语句1……case值n:语句n[default:语句]}多分支选择结构。比较变量的值,假如为值1,则执行语句1以及以后的语句,假如为值n,则执行语句n以及以后的语句。假如只想执行某一分支的语句n,则在语句n的最后应加break;语句。注:假如读者没有结构化程序设计的基础,可以参考Flash的脚本帮助,打开Flash程序,选择【帮助】|【Flash帮助】或者按F1就可以打开Flash的帮助面板。可以在目录中寻找或者直接搜索来找到要学习的内容。任何软件,它的帮助文献就是最佳的教材。或者读者也可以找任何一本编程基础的书籍,翻看之后即会明白。 更多的语句、关键字和指令,可以参考Flash的帮助文献,其位置如下图所示:算术运算:再看本例接下来的一行代码:sum=i*(i+1)/2;这行代码的作用是将1~i的整数数字累加的结果放在sum变量中。它使用了多个算术运算符以及赋值运算符“=”。事实上,可以将这上行代码用一个for循环来表达。sum=0;for(varj:Number=1;j<=i;j++){sum=sum+j;}但这明显增长了代码的复杂度。使用累加的公式:则代码变简朴,执行效率当然就提高了。游戏中经常需要使得运动满足各种物理运动规律,这些规律都有公式可循,附录中给出了一些常用的数学与物理现象公式以供参考。下表是ActionScript的算术运算符:运算符说明=赋值运算符?:条件运算符+相加-相减*相乘/相除%取余++自加1--自减1()小括号和代数运算同样,程序中的运算符也具有优先级,程序总是先执行优先级最高的运算。上表中,运算符的优先级正好从低到高排列(有相同优先级的,如加法“+”和减法“-”的优先级是同样的。事实上,程序中的算计运算的优先级和中小学算术运算的优先级是一致的,所以非常好理解。跟踪调试函数trace:再看本例接下来的一行代码:trace("1累加到"+i+"的值为:"+sum);trace是一个跟踪调试的函数,它可以在输出窗口中一字符串的方式输出trace函数的参数,每条trace语句输出一行字符串。trace语句可以有一个或者多个参数,参数的类型可以是任意的,事实上,它将条用参数对象的toString方法,输出对象的字符串表达方式。本例中使用了字符串连接符“+”将多个字符串连接成一个字符串作为trace函数的参数。运算符“+”的两边都是数字的时候表达加法运算,但是假如两边有一个是字符串,则表达字符串连接运算。trace语句是调试程序的好帮手。它可以输出一些运营时的信息以便检测程序执行和发现程序错误。trace语句在发布的swf文献中不起作用,不会对最后结果导致影响。假如想在调试过程中暂时不输出trace的结果,那么在【文献】|【发布设立】的Flash页中勾选“省略trace动作”即可。如下图所示:trace输出开关在接下来的例子中,我们还将多次使用到trace语句,用来查看程序执行的中间结果以及最后结果。涉及在游戏实例代码中也也许保存着trace语句,那是调试游戏时留下的,对最终的程序没有影响,也不必删除。第二段示例代码程序说明:建立一个4×6的二维数组,每个数组元素保存一个0~10的随机整数,然后输出这个数组。新建Flash文档,输入以下代码://定义一维数组varmyArray:Array=newArray(4);for(vari=0;i<4;i++){ //一维数组的每个元素为一个新的一维数组 myArray[i]=newArray(6); for(varj=0;j<6;j++){ //给数组元素赋随机值 myArray[i][j]=int(Math.random()*10); } //输出一维数组myArray[i] trace(myArray[i]);}按Ctrl+Enter测试影片,则输出这个二维数组的值。某次的输出如下:3,8,7,4,0,40,6,0,1,1,86,0,6,7,5,01,9,8,5,6,4这段代码包含以下的知识点:数组对象以及多维数组的使用嵌套循环内建数学类Math的使用数据类型转换编译器的严谨模式与非严谨模式现在来解释这些代码,先看第一行代码:varmyArray:Array=newArray(4);这里声明了一个Array类型的变量myArray,并用new关键字创建这个Array对象的实例,初始化其长度为4。Array是一个用来表达一维数组的数据类型,它可以存储任意类型的数据或对象。数组是游戏程序中频繁使用到的一种数据类型。用变量名称引用数组对象,访问数组的每个元素则使用下标运算符“[]”,下标从0开始编号。假设数组元素存储的是另一个数组,那么就构成了二维数组,以此类推。多维数组的的访问采用多个下标运算符即可。Array是一个复杂对象,必须用new关键字创建它的实例,否则声明的变量无法访问,由于ActionScript要通过new关键字给复杂对象在内存中开辟一个空间,存储这个对象之用。也可以创建一个空的数组对象,或者创建数组对象的同时给数组赋值。如下代码所示://创建一个空的数组varmyArray1:Array=newArray();//创建一个有三个元素的数组,元素值分别为1,2,3varmyArray2:Array=newArray(1,2,3);数组对象不仅仅为我们提供了存储数组的数据结构,同时还提供了一些基于数组的属性和操作函数等,例如数组的长度、给数组元素排序等等。这里不一一举例说明,而仅以列表的方式给出数组对象Array常用的成员:成员说明length属性,表达数组中元素数量的非负整数。Array(numElements:int=0)允许创建指定元素数量的数组,默认为0。Array(...values)允许创建包含指定元素的数组。concat(...args):Array将参数中指定的元素(组)附加到数组中,形成新的数组。forEach(callback:Function,thisObject:*=null):void对数组中的每一项执行函数。pop():Object删除数组中最后一个元素,并返回该元素的值。push(...args):uint将一个或多个元素添加到数组的结尾,并返回该数组的新长度。reverse():Array倒转数组的顺序。shift():Object删除数组中第一个元素,并返回该元素。slice(startIndex:int=0,endIndex:int=16777215):Array返回由原始数组中某一范围的元素构成的新数组,而不修改原始数组。some(callback:Function,thisObject:*=null):Boolean对数组中的每一项执行测试函数,直到获得返回true的项。sort(...args):Array对数组中的元素进行排序。splice(startIndex:int,deleteCount:uint,...values):Array给数组添加元素以及从数组中删除元素。unshift(...args):uint将一个或多个元素添加到数组的开头,并返回该数组的新长度。类成员的使用方法为:变量名.成员名假如成员为一函数,则需要加括号“()”,假如函数有参数,则放在括号里面,多个参数用逗号“,”隔开。Array对象不仅有以上这些成员,尚有一些被称为静态常数的成员。所谓的静态成员,是指使用类名引用而不是类实例名引用的成员。静态成员一般用于辅助此类相关的一些操作。例如Array.NUMERIC就是一个Array类的静态属性(也称为常数),在对数进行排序的时候用来表达按数值大小的顺序排序而不是字符串编码的顺序排序。提醒:本书中有许多的知识列表,为了节约篇幅,这些列表一般都是通过精简,剔除了游戏程序中不用或者很少使用到的项。读者若想了解这些被精简的项,可以参考Flash帮助文献。嵌套循环:再看看接下来的一段代码:for(vari=0;i<4;i++){ //一维数组的每个元素为一个新的一维数组 myArray[i]=newArray(6); for(varj=0;j<6;j++){ //给数组元素赋随机值 myArray[i][j]=int(Math.random()*9); }}这段代码的结构为嵌套的循环结构。第一层循环给myArray数组的每一个元素赋值一个新的数组,第二层循环为myArray数组的每个元素所表达的数组的每个元素赋随机的初始值。这段代码用流程图表达如下:嵌套循环上图中,内部循环结构可以看作是一个简朴的表达式,它与其前一条语句组成顺序结构,而这个顺序结构又可以看作是一个简朴的表达式,而成为外部循环结构的内嵌表达式。一个完整的程序,是有着大量的顺序结构、选择结构和循环结构嵌套、组合的的复合体。纯熟使用结构化程序设计思想是编写复杂程序的基础。Math类:这段代码还用到了Flash内建的数学类Math的一个静态方法:random(),它的作用是生成一个0~1之间的随机小数。Math是Flash内嵌的数学计算辅助类,开发游戏经常要和这个类打交道。它是一个静态类,包含一些静态函数和静态属性,以提供常用的数学方法和数学常数,在程序的任何地方都可以调用这些成员。例如表达圆周率π的常数为Math.PI。下面这行代码计算面积为area的圆的半径:r=Math.sqrt(area/Math.PI);下表列出了Math对象的部分常数。常数说明E代表自然对数的底的数学常数,表达为e。LN10代表10的自然对数的数学常数,其近似值为2.046。LN2代表2的自然对数的数学常数,其近似值为0.69353。PI代表一个圆的周长与其直径的比值的数学常数,其近似值为3.9793。SQRT1_2代表1/2的平方根的数学常数,其近似值为0.5476。SQRT2代表2的平方根的数学常数,其近似值为1.40951。Math还包含了一些数学函数。在游戏编程中将经常用到这些方法。下表列出了Math对象的部分数学函数:函数说明abs(x)返回由参数x指定的数字的绝对值。acos(x)返回由参数x指定的数字的反余弦值。asin(x)返回由参数x指定的数字的反正弦值。atan(tangent)返回角度值,该角度的正切值已由参数tangent指定。cos(x)返回指定角度的余弦值。exp(x)返回自然对数的底的x次幂的值。log(x)返回参数x的自然对数。pow(x,y)计算并返回x的y次幂。random()返回一个伪随机数n,其中0<=n<1。round(x)将参数x的值向上或向下舍入为最接近的整数并返回该值。sin(x)以弧度为单位计算并返回指定角度的正弦值。sqrt(x)计算并返回指定数字的平方根。tan(x)计算并返回指定角度的正切值。注:上表中的所有三角函数和反三角函数都是以弧度制为单位。Math完整的常数和方法请参看脚本提醒,或者查看Flash的帮助文献。类型转换这段代码中,在给二维数组的每个元素赋值以前,先将随机数进行了强制类型转换:int(),它的作用是将随机生成的小数转换成整数。将某种类型的数据(对象)转换为其它类型的数据(对象)时,就说发生了类型转换。类型转换有两种:一种是隐式转换,另一种是显式转换。隐式转换又称为强制转换,是代码中没有指示却事实上进行了的类型转换,在运营时由FlashPlayer执行。隐式转换发生在以下情况中:在赋值语句中在将值作为函数的参数传递时在从函数中返回值时在使用某些运算符(如加法运算符(+))的表达式中显式转换由代码指示编译器将一个数据类型的变量视为属于另一个数据类型时发生。语法为:目的类型(被转换对象)例如:varquantityField:String="3";varquantity:int=int(quantityField);//显式转换不管是显式转换还是隐式转换,其内部的算法都是同样的。类型转换之后,也许会发生值的改变。例如Number类型转换成int类型,则会将小数点后面的数值截断,将数值类型转换成Boolean类型时,非0值转换成true,而0转换成false。假如转换的目的类型是复杂类,则被转换对象应当是相关类型,相关类型指具有继承关系的类型。所有的复杂类都继承自Object类,所以所有复杂类都可以转换为Object类。MovieClip类继承自Sprite类,所以MovieClip类可以转换成Sprite类,但是Sprite类不能转换成MovieClip类,由于MovieClip类不是Sprite类的相关类型。Date类与MovieClip类之间互不继承,所以它们之间不能互相转换。在类型转换中假如出现类型不匹配,则会出现错误。假如编译器为严谨模式,则在编译的时候就会弹出编译错误,程序无法编译完毕,但是假如是标准模式,则会在程序运营到类型匹配错误的时候才弹犯错误。当程序比较庞大时,越早发现错误越好,所以程序员都倾向于使用严谨模式。修改严谨模式的方法为:选择【文献】|【发布设立】,然后选择“Flash”标签,在ActionScript版本下来框中选择“ActionScript3.0”,然后点击旁边的“设立”按钮,弹出“ActionScript3.0设立”严谨模式设立勾选“严谨模式”即可。新建的AS3文档默认使用严谨模式,但AS2无严谨模式的概念,假如您使用的是由AS2文档转换过来的AS3文档,则默认使用非严谨模式。此外,严谨模式还规定变量都要先声明才干使用,假如在发布设立中取消了严谨模式,则Flash可以不显式声明变量(即不使用var关键字声明变量)。如varcount:Number=5;可以写成count=5;两者的效果是同样的,Flash在第一次使用这个变量的时候自动定义这个变量,并且根据所赋的值的类型拟定变量的数据类型。但有经验的程序员都明白,先声明后使用的严谨编程习惯,对减少编程错误、维护复杂程序等方面是非常故意义的做法,目前绝大多数编程语言都逐渐摒弃了非严谨模式,AS3因向下兼容的需要而保存了这个选项。第三段示例代码程序说明:寻找一个1000以内的,能被7整除并且二进制数的第四位是0第五位是1的数字。新建Flash文档,输入以下代码:vartestNumber;varcount=0;do{ count++; //随机产生一个1~1000之间的整数 testNumber=Math.round(Math.random()*1000);}while(!correctNumber(testNumber));trace("找到一个能被7整除并且二进制数的第四位是0第五位是1的数字:\r"+testNumber);trace("总共循环了\""+count+"\"次");functioncorrectNumber(para1:Number):Boolean{ if(para1%7==0&&(para1>>3)%4==2){ returntrue; }else{ returnfalse; }}按Ctrl+Enter测试影片。会得到如下的输出结果:找到一个能被7整除并且二进制数的第四位是0第五位是1的数字:693总共循环了"5"次代码说明:这段代码的执行过程是先随机生成一个1~1000的整数,然后判断它是否满足给出的条件,假如不是,那么重新生成一个随机数,重新判断,直到找到一个满足条件的数字,最后输出这个数字以及循环的次数。这段代码包含以下知识点:自定义函数逻辑运算符复合逻辑关系关系运算符位运算符转义字符现在来解释一下其中的一些关键代码:testNumber=Math.round(Math.random()*1000);这里再次使用了Math对象的两个方法,用来产生一个1000以内的随机整数。回到示例代码,看看下面这行代码:while(!correctNumber(testNumber));这是dowhile循环结构中的条件部分。它调用了一个自定义函数correctNumber(),它有一个数值类型的参数,当参数不是目的数值,则函数返回值为false时,由于进行了非运算(!),条件变成true,程序进入下一次循环,即继续执行do语句后面的代码,直到当参数就是目的数值,函数返回值为true,进行非运算之后变成false,不满足循环条件,才跳出循环。自定义函数:函数correctNumber()实现了是否是所要数字的判断,是这段程序的重要组成部分。使用函数可以提高代码的可读性和可维护性,一般在如下情况下使用函数:代码的输入和输出比较简朴而中间过程比较复杂。使用函数使得在直观上把实现的细节隐藏,提高了代码的可读性。在多个地方都要使用到相同的代码,或者只有参数不同的代码。就是说这段代码是为了完毕某个常用的任务。例如在一个拼图游戏里面,点击任意一个方块都会执行相应的移动(或者不移动)方块的操作。初学者往往习惯于把相关程序放在每个方块对象上。这导致代码的大量冗余,可维护性差。而聪明的方法是将相应的操作写成一个函数,然后通过对象的事件解决函数调用这个函数,并将被点击对象的标记符(自定义)属性作为这个函数的参数。某一大段代码是为了完毕某个单一的任务。这同样是为了提到代码的可读性。经验表白,每个程序块在30自然行以内比较方便维护。也就是说,假如你有段代码超过30行,那么应当考虑是否要使用函数切分这个程序块了。说了这么多,现在来看看如何实现自定义函数吧!自定义函数的语法如下:function函数名(参数列表)[:返回类型]{函数内部代码[return返回值]}注:方括号表达其为语法结构中的可选项。自定义函数的另一种语法是:函数名=function(参数列表)[:返回类型]{函数内部代码[return返回值]}函数可以没有参数,也可以有多个参数,多个参数用逗号隔开。返回类型指定这个函数返回的是什么类型的数据,由函数内部代码中的return语句返回。假如函数没有返回值,则返回类型为void。一个有趣的现象是在AS2中,函数可以嵌套定义。也就是说,可以将一个函数定义在另一个函数之中。这样,就可以通过函数来组织一个数据+操作的结构。这样的函数结构与类(Class)已经很接近了。再继续看这行代码:if(para1%7==0&&(para1>>3)%4==2){逻辑运算符:&&是一个逻辑运算符。表达逻辑关系“与”,只有&&两边的表达式都为true,结果才为true。ActionScript提供三种逻辑运算符:运算符执行的运算&&(AND)逻辑"与"||(OR)逻辑"或"!(NOT)逻辑"非"复合逻辑关系:这是一个if条件结构的一部分,括号内部是一个Boolean类型值。它可以由多个逻辑值通过逻辑运算符组合而成,这个组合就是复合逻辑表达式,复合的结果要么是true,要么是false。下表是最简的复合判断表:运算符结果A&&B(与)若A、B皆为true则返回true,否则返回falseA||B(或)只要A、B中有一个为true,就返回true,否则返回false!A(非)若A为true,返回false,若A为false,返回true关系运算符:testNumber%7==0是一个关系判断语句,先把testNumber对7求余数,然后比较“==”号两边的数值,假如==号两边的值相等,则结果为true,否则结果为false。“==”号是一个关系运算符。和其它编程语言同样,ActionScript提供丰富的关系运算符。它们都有两个操作数,比较两个操作数的值,然后依据比较的规则返回一个布尔值。ActionScript中的关系运算符列表如下:运算符执行的运算<小于>大于<=小于或等于>=大于或等于==等于===假如两者相等并且数据类型也相同时成立!===假如两者不相等并且数据类型也不相同时成了instanceof假如运算符左边的变量原型是右边所示的类时成立此表中的所有运算符都具有相同的优先级并且高于所有的逻辑运算符。位运算符:这段代码中有一个位运算符“>>”,它的作用是直接将数值的二进制数按位向右移动3位,被移出的部分自动剔除而空缺的位自动补0。例如假设para1=173,省略高位的0,则其二进制表达为:10101101。右移3位之后则变成10101,十进制的数值为:21。Flash提供丰富的位操作符。使用位操作的优点是它提供了一种新的运算方式,并且由于它直接操作二进制数,提高了计算的速度。常用位运算表如下:运算符执行的运算&按位"与"|按位"或"<<左移>>右移^按位异或转义字符:再看本例接下来的代码:trace("找到一个能被7整除并且二进制数的第四位是0第五位是1的数字:\r"+testNumber);trace("总共循环了\""+count+"\"次");这两条trace语句与先前不同的是使用了转义字符。转义字符指那些不能直接在字符串中表达出来的字符,由于这些字符被引作它用。例如双引号“””,在程序中用来表达字符串的开始或者结束。假如某字符串自身具有双引号,则必须使用转义字符。转义字符以反斜杠“\”标记,反斜杠的转义字符为两个反斜杠“\\”。下表是一些常用的转义字符。转义序列说明\b退格符。\f换页符。\n换行符。\r回车。\t制表符。\unnnn任意的Unicode字符,字符代码由十六进制数字nnnn指定。例如,\u263a是一个微笑字符。\xnn任意的ASCII字符,字符代码由十六进制数字nn指定。\'单引号。\"双引号。\\单反斜杠字符。自此我们已经用三个简短的代码将ActionScript脚本语言的语法结构,以及数组的使用,内置类的使用进行的大体的讲解。由于本书的定位不是讲解ActionScript的用法,而是用ActionScript开发游戏,所以仅对这些基础知识点到为止。错误与调试程序错误有三种,一种是语法错误,编译时提醒编译错误并列出发现错误所在位置。一种是运营时错误,编译通过了,但是在程序运营的时候出现了错误。尚有一种是逻辑错误,就是程序不会抛出任何错误,但是无法得到“应有”的结果。语法错误与解决所有的语法错误都在点击语法检查或者按Ctrl+Enter编译时在输出窗口中报错,只有没有语法错误的代码才干通过编译器编译。先看看语法错误的例子,新建Flash文档,输入以下代码:vartoday:Date=newDate();trace("今天是:");trace(today.getFullYear()+"年+(today.getMonth()+1)+"月"+today.getDate()+"日");按Ctrrl+Enter测试影片,会看到输出窗口输出两个编译错误:语法错误双击其中的一条错误,即可跳转到发现错误所在的代码行。错误描述则给出了关于错误的具体说明,根据错误描述可以比较容易就找到错误的因素所在。需要注意的是,错误提醒给出的错误位置和错误描述并不一定准确无误。由于编译器只有按语法规则在代码发现语法错误的时候才报错,但此时也许已通过了实际错误所在,或者是由其它错误连带引起的语法错误。如上面的例子,实际错误是在“年”字后面少了一个双引号“””。但是程序执行到这个位置的时候并不会发现错误,由于编译器把“年+(today.getMonth()+1)+”当作是一个字符串,直到“月”字才发现语法错误。编译器认为“月”是一个变量,而它与前面的字符串之间缺少了连接符。同时编译器还发现了连带引起的语法错误:在该语句结尾字符串没有结束。事实上并不一定要在编译的时候才干检测语法错误。一种简朴的方法是看代码的颜色。ActionScript代码带有某些色彩,以便区分各种类型的标记符。默认情况下,关键字是蓝色,字符串是绿色,注释是灰色,函数与变量是黑色。假如发现非预期的颜色,就可以确认代码中存在语法错误。例如本例的代码在动作面板中的颜色为:代码的颜色尚有一个方法是点击动作面板上的语法检查按钮。假如有错误,则会弹出输出窗口并显示当前代码的所有语法错误。提醒编译器错误避免运营时错误与逻辑错误排除运营时错误和逻辑错误是一件费时费力的工作。Flash游戏特别如此,由于FlashPlayer往往以嵌入在其它软件中的形式存在,为了不把错误传递给它的“载体”,FlashPlayer将几乎所有的错误都“藏”了起来,甚至在调试时也不提醒错误。隐藏错误增强了程序执行时的稳定性,但却给开发人员排除错误留下不少的困难。所幸的是3.0已经采用了积极的措施,引入了成套的错误解决机制,大大减少了除错的难度。在讲解如何除错之前,应当一方面考虑如何减少错误。养成良好的编程习惯是必要的。以下是一些建议:采用一致的命名规则附录中给出了ActionScript程序员共同遵循的一组命名规则,读者最佳也遵循这样的命名规则。多添加注释假如没有注释,即使是自己写的程序,时间久了阅读起来也存在困难。修改起来就更加麻烦,更加容易引入错误。应用软件工程的思想,做到高内聚低耦合高内聚低耦合是软件设计的一个基本原则,说的是在程序的各个模块中,尽量让每个模块独立,同时相关的解决尽量在单个模块中完毕。这样能提减少各模块的之间的联系,减少“牵一发而动全身”的几率,提高开发效率,减少升级维护成本,也便于进行单元测试,提高软件质量。即使小到一个函数,也应当遵照这个原则。在程序中采用合适的错误解决机制虽然没有错误解决机制程序一般能顺利运营,但程序不会总是按抱负的方式运营。例如加载外部文献,假如文献不存在了,自然程序就会不正常。网络通信、用户操作、文献读写、条件局限性、设备忙是常见的犯错地方,在这些地方添加错误捕获机制可以捕获这些错误,然后作相应的解决。采用了错误解决机制的程序可以适应更加“恶劣”的使用环境,使得程序更加健壮。ActionScript2.0可以使用Error类,使用try-catch-finally机制捕获错误,或者重载错误事件。Error类是遵循ECMAScript规范的核心类,ActionScript3.0中仍然可以使用,也可以使用侦听器捕获错误事件,关于侦听器的使用请参看相关的章节。同时它还采用flash.errors类包中的类捕获更确切的错误。提醒:在错误解决方面,ActionScript3.0比ActionScript2.0有了比较大的改善。它提供了更加贴切的语法错误消息、更多的警告、抛出更多的错误以及扩展的捕获错误的体系结构。调试时,3.0出现错误后就停止执行代码,而2.0却会在错误情况下继续执行。try-catch-finally机制举例:新建文档(AS3),输入以下代码://仅合用于ActionScript3.0及以上版本importflash.errors.IOError;importflash.media.Sound;varmusic:Sound=newSound();try{ music.close(); trace("声音停止了");}catch(error:IOError){ trace("声音流关闭出现错误:\r"+error.toString()); trace("更多的错误解决代码");}finally{ trace("不管是否捕获到错误,这段代码都被执行"); //一般在此处做释放内存操作}一方面用import语句导入FlashPlayer的两个API,然后创建一个API对象Sound的实例music,接着尝试关闭music。由于music实例还加载声音流,所以使用close方法的时候犯错,Flash抛出IOError,被try-catch结构捕获,程序跳入catch部分进行一些解决。按Ctrl+Enter测试影片,得到如下的输出:声音流关闭出现错误:Error:Error#2029:此URLStream对象中没有已打开的流。更多的错误解决代码不管是否捕获到错误,这段代码都被执行从结果中可以看出,当music实例close的时候触发错误,程序跳转到捕获错误的位置,所以“trace("声音停止了");”这行代码没有被执行。提醒:一个try语句可以带多个catch语句,以便捕获到不同的错误,作不同的解决。finally语句是可选的。初学者易犯的编程错误把逻辑运算符“==”错写成赋值运算符“=”大小写错误对象途径没有对的指定Flash的总体框架是一个树型结构,而代码又分散在这个结构的各个分支。假如没有指定对的的途径,当然无法得到对的的结果。有两种方法指定途径:相对途径和绝对途径。类名与类实例名混淆我们得分清楚类名和类实例名的区别。类是面向对象语言构建软件的基本构件,而实例,则是类在程序中的副本。可以理解为类是实例的模板,而实例是类的表现形式。一个类可以有多个实例,而一个实例只能属于一个类。库中的元件和场景中的剪辑就是类与类实例的典型代表。在程序中,只能通过类实例名来引用某个具体的实例,而不是类名。例如库中有一个名为“boy”的元件,将其拖到场景中(即创建这个类的实例),在属性栏中设立实例名称为“boy1”。那么控制这个剪辑停止播放的代码应为:boy1.stop();混淆数字“+”运算与字符串“+”运算数字“+”运算返回两个数字相加的结果,而字符串“+”运算返回两个字符串连接在一起的字符串。当“+”号两边都是数字的时候,按数字加法运算,当“+”号两边有一边是字符串的时候,按字符串连接解决。但是问题的关键是假如没有强行指定数据的类型,那么ActionScript有也许将数字类型当字符串解决,从而犯错。例如程序中有三个文本框,txt1,txt2,txtResult,和三个变量num1,num2和sum。我们希望用户输入在txt1中txt2输入数字后点击“计算”按钮,将两个数相加的结果存储在sum中并显示。我们很自然地想到用下面的表达式:num1=txt1.text;num2=txt2.text;sum=num1+num2;txtResult.text=sum;但是相加的结果却令人吃惊。假如5和7,那么计算的结果显示为12,这还算正常,但是当一个文本框输入3e-2(科学计数法,表达0.03)另一个输入3时,计算的结果显示为“3e-23”!为什么会出现这种结果呢?由于ActionScript将这两个变量当作字符串相加了!所以,在参与“+”例如上面数字相加的代码,应当改写成:sum=Number(num1)+Number(num2);某些字符辨认错误有些字符看上去非常像,例如字母l、g、o与数字1、9、0;把中文输入法的全角标号当作英文的半角标号而犯错,如“(”、“)”、“,”、“;”,被写成了“(”、“)”、“,”、“;”,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论