资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
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代码的各种实用的按钮, 这些按钮的说明如下图所示:
动作面板的工具栏及其解释
点击按钮将弹出与语言元素列表内容一样的菜单。点击按钮能够在编译之前查找代码的语法错误, 这些错误会在输出窗口中显示。点击能够将代码依据其结构自动缩进对齐, 如果代码存在语法错误, 则会提示语法错误, 无法套用格式。
从起右边的按钮, 是Flash CS3新增的。这些按钮和Visual Studio .NET的相关工具类似, 估计是汲取其优点而添加的。
脚本助手:
脚本助手开启时, 会在动作面板的上部显示当前行代码的结构信息, 提供详细的辅助信息。如图所示, 点击for循环语句首行时脚本助手显示的信息:
脚本助手
开启脚本助手时无法自由修改脚本代码, 而且挤占了动作面板许多空间, 因此它只适合初学者在不清楚程序结构或者担心引入语法错误的情况下使用。当读者对ActionScript的语法与结构具有一定的了解之后, 应该取消脚本助手, 而在代码窗口中自由地编辑代码。
二、 语法与结构
本章节讲解ActionScript的语法与结构, 但并不按教科书的方式详细讲解。而是完全将Flash CS3看作是一种面向对象的编程开发环境, 以最简练的代码讲解ActionScript的语法与结构。从简练的代码中引申出来的各种编程概念和知识面, 则以列表的方式平铺。这种方法能够使大家利用以前所学的其它语言的编程知识, 快速过渡到ActionScript编程上来。
1) 第一段示例代码
打开Flash CS3 Professional, 选择【文件】|【新建】, 或者按Ctrl+N, 弹出新建文档对话框。选择”Flash文档( ActionScript3.0) ”, 按确定新建一个Flash文档。点击”图层1”的第1帧, 按【F9】弹出动作面板, 输入以下代码:
//这是我第一次写ActionScript脚本
var sum:Number;
var count:Number = 5;
sum = 0;
for (var i:Number = 1; i<=count; i++) {
sum = i*(i+1)/2;
trace("1累加到"+i+"的值为: "+sum);
}
如下图所示:
第一个脚本
注意: 下文若提到”输入以下代码”时, 就是在新建文档的图层1的第1帧的动作面板中输入下框中的代码。
在调试程序前保存文件是一个良好的习惯, 因为谁也不能肯定刚刚编写的脚本不会在调试过程中造成死机, 若调试过程中出现死机或者意外退出Flash程序, 那么没有保存的内容将会丢失。按Ctrl+S保存文件, 然后选择【控制】|【测试影片】, 或者按Ctrl+Enter测试影片。这时会弹出两个窗口, 一个是Flash作品的窗口, 因为刚才没有建立任何可见的元素, 因此这个窗口是空白的。还有一个是输出窗口, 当有trace输出语句或者出现语法错误的时候就会自动弹出输出窗口。
本段程序测试时输出窗口如下图所示:
本程序的输出
这段代码包含以下知识点:
u 代码注释的语法
u 变量声明与赋值的方法
u 数据类型与默认值
u 显式类型指定及其意义
u 程序结构语句
u 基本数学运算
u trace语句介绍
现在让我们一行行地认识这些代码:
//这是我第一次写脚本
这是一行代码注释, 编译器将忽略这行文字。注释提高了代码的可读性。单行注释由”//”开始, 在代码中呈灰色。如果需要多行注释, 则使用”/*”开始, 用”*/”结束。一个典型的多行注释如下所示:
/********************************
* Boat.as *
* 轮船类 *
* 作者: 肖 刚 *
*********************************/
再看本例接下来的两行代码:
var sum:Number;
var count:Number=5;
这两行代码声明两个数值类型的变量sum和count。var是声明变量的关键字, sum与count是变量名称。Number指出变量数据类型为数值。第二行代码声明变量count的同时赋值一个初始值5。
对于面向对象的程序设计语言来说, 所有的数据类型都是对象, 都是类。Flash的内置类能够分为两种, 一种是基元类型, 也被成为原始类型, 它们一般用来存储一些简单的数据, 有的原始类型还具有一些针对所存储的数据的属性和方法。原始类型是构建复杂类的基本元素。另一种是复杂类, 它们是由class关键字定义的类, 能够认为是程序的构件, 一般具有成套的属性、 方法和事件。原始类型的变量直接存储数据, 而复杂类型的变量存储的是类的引用。更多的关于类与对象的介绍, 请参看”Flash的内置类”以及”面向对象程序设计”章节。
下表列出了ActionScript 常见的原始类型, 以及其简要的说明, 它们的用法都是大同小异的:
数据类型
说明
Boolean
Boolean 数据类型包括两个值: true 和 false。对于此类变量, 其它任何值都是无效的。已经声明但尚未初始化的布尔变量的默认值是 false。
Number
此数据类型能够表示整数、 无符号整数和浮点数。若要存储浮点数, 数字中应该包括一个小数点。若没有小数点, 数字将被存储为整数。
int
存储32位有符号整形数据。使用int类型有助于利用CPU快速处理整形运算的能力。( 仅适用于ActionScript3.0)
uint
存储32 位无符号整数的数据。uint 类主要用于像素颜色值( ARGB 和 RGBA) 和 int 数据类型无法很好工作的其它情况。( 仅适用于ActionScript3.0)
String
String 数据类型表示 16 位字符的序列, 可能包括字母、 数字和标点符号。字符串存储为 Unicode 字符, 使用 UTF-16 格式。对字符串值的操作返回字符串的一个新的实例。
默认值
如果没有给变量赋值, 变量将采用默认值。变量默认值列表如下:
数据类型
默认值
Boolean
false
int
0
Number
NaN
Object
undefined
String
null
uint
0
未声明( 与类型注释 * 等效)
undefined
其它所有类( 包括用户定义的类)
undefined
显式类型指定:
双引号”:”是类型(type)运算符, 用于显式指定变量的数据类型, 与var关键字配合使用。它能够指定变量类型、 函数返回类型或函数参数类型。在变量声明或赋值中使用时, 此运算符指定变量的类型; 在函数声明或定义中使用时, 此运算符指定函数的返回类型; 在函数定义中与函数参数一起使用时, 此运算符指定该参数预期的变量类型。
显式指定数据类型不但仅是一个良好的编程习惯, 以便避免运行时出现不匹配情况; 同时, 对于Flash来说, 脚本编辑器支持内置类和基于这些类的变量的代码提示, 从而提高了编程的效率。如果需要为指定的变量的特定对象类型提供代码提示就要严格指定变量类型, Flash根据变量的类型弹出合适的提示。代码提示有两种: 弹出菜单提示和工具提示样式的语法提示。
弹出菜单提示如下图所示:
弹出菜单提示
由于在之前显式声明了变量today为Date( 日期) 类型, 因此当用键盘敲入”today”然后敲入”.”时, 编辑器就会自动列出Date类型的变量的所有属性和方法供我们选择。这大大提高了编程的效率, 也减少了由于记忆或者输入错误而引起的程序错误。
语法提示如下图所示:
语法提示
语法提示在使用内置类的成员函数时出现, 如上图中我们使用了内置类Date的getFullYear函数时, 它会提示我们这个函数的参数为空, 函数的返回值为Number类型。
程序的基本结构:
继续看接下去的代码:
for (var i:Number=1; i<=count; i++) {
//内部代码略
这是一个for循环结构。它的标准格式为:
for(表示式1;表示式2;表示式3){
内嵌语句
}
它的执行过程如下:
(1) 求解表示式1
(2) 求解表示式2, 若其值为真( true) , 则执行内嵌语句, 若为假( false) , 则转到第( 5) 步
(3) 求解表示式3
(4) 转回上面第( 2) 步继续执行
(5) 循环结束, 执行for循环以后的过程
使用流程图来表示的话, for循环结构的执行如下图所示:
for循环结构
虽然表示式1到表示式3能够是任意的单条语句, 可是最常见的是它们分别表示循环变量赋初始值, 循环条件, 循环变量增值, 例如本例的代码。
一般的计算机程序总是由若干条语句组成, 从执行方式上看, 从第一条语句到最后一条语句完全按顺序执行, 是简单的顺序结构; 若在程序执行过程当中, 根据用户的输入或中间结果去执行若干不同的任务则为选择结构; 如果在程序的某处, 需要根据某项条件重复地执行某项任务若干次或直到满足或不满足某条件为止, 这就构成循环结构。顺序结构、 循环结构、 选择结构构成了结构化程序设计的三个基本单元, 而众多的基本单元构成庞大的程序。
顺序结构的流程图如下所示:
顺序结构
典型的选择结构的流程图如下所示:
典型选择结构
按顺序编写的语句即为顺序结构, 因此没有结构语句, 而循环结构和选择结构分别有多种语句结构, 这些结构如下表所示:
结构类型
语句以及语法
说明
循环结构
for(初始值;条件;增值){语句}
先赋初始值, 然后判断条件,为真的情况下执行语句, 然后增值, 完成一次循环, 接着重新判断条件, 直到条件为假。
for(变量 in 对象){语句}
顺序遍历对象的属性或数组中的元素, 并对每个属性或元素执行语句。
while(条件){语句}
当条件为真时执行语句, 然后判断条件, 如果为真, 执行语句, 重新判断条件, 直到条件为假。
do {语句} while(条件);
先执行语句, 然后判断条件, 如果为真, 继续执行语句。
选择结构
if(条件){语句}
判断条件, 如果为真, 则执行语句。
if(条件){语句1}
else{语句2}
判断条件, 如果为真, 执行语句1, 否则, 执行语句2。
if(条件1){语句1}
else if(条件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( var j: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语句, 那是调试游戏时留下的, 对最终的程序没有影响, 也不必删除。
2) 第二段示例代码
程序说明:
建立一个4×6的二维数组, 每个数组元素保存一个0~10的随机整数, 然后输出这个数组。
新建Flash文档, 输入以下代码:
//定义一维数组
var myArray:Array = new Array(4);
for (var i=0; i<4; i++) {
//一维数组的每个元素为一个新的一维数组
myArray[i] = new Array(6);
for (var j=0; j<6; j++) {
//给数组元素赋随机值
myArray[i][j] = int(Math.random()*10);
}
//输出一维数组myArray[i]
trace(myArray[i]);
}
按Ctrl+Enter测试影片, 则输出这个二维数组的值。某次的输出如下:
3,8,7,4,0,4
0,6,0,1,1,8
6,0,6,7,5,0
1,9,8,5,6,4
这段代码包含以下的知识点:
u 数组对象以及多维数组的使用
u 嵌套循环
u 内建数学类Math的使用
u 数据类型转换
u 编译器的严谨模式与非严谨模式
现在来解释这些代码, 先看第一行代码:
var myArray:Array = new Array(4);
这里声明了一个Array类型的变量myArray, 并用new关键字创立这个Array对象的实例, 初始化其长度为4。Array是一个用来表示一维数组的数据类型, 它能够存储任意类型的数据或对象。
数组是游戏程序中频繁使用到的一种数据类型。用变量名称引用数组对象, 访问数组的每个元素则使用下标运算符”[]”, 下标从0开始编号。假设数组元素存储的是另一个数组, 那么就构成了二维数组, 以此类推。多维数组的的访问采用多个下标运算符即可。Array是一个复杂对象, 必须用new关键字创立它的实例, 否则声明的变量无法访问, 因为ActionScript要经过new关键字给复杂对象在内存中开辟一个空间, 存储这个对象之用。
也能够创立一个空的数组对象, 或者创立数组对象的同时给数组赋值。如下代码所示:
//创立一个空的数组
var myArray1:Array = new Array();
//创立一个有三个元素的数组, 元素值分别为1, 2, 3
var myArray2:Array = new Array(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 (var i=0; i<4; i++) {
//一维数组的每个元素为一个新的一维数组
myArray[i] = new Array(6);
for (var j=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(), 它的作用是将随机生成的小数转换成整数。
将某种类型的数据( 对象) 转换为其它类型的数据( 对象) 时, 就说发生了类型转换。类型转换有两种: 一种是隐式转换, 另一种是显式转换。
隐式转换又称为强制转换, 是代码中没有指示却实际上进行了的类型转换, 在运行时由Flash Player执行。隐式转换发生在以下情况中:
u 在赋值语句中
u 在将值作为函数的参数传递时
u 在从函数中返回值时
u 在使用某些运算符( 如加法运算符 (+)) 的表示式中
显式转换由代码指示编译器将一个数据类型的变量视为属于另一个数据类型时发生。语法为:
目标类型(被转换对象)
例如:
var quantityField:String = "3";
var quantity: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关键字声明变量) 。如
var count:Number=5;
能够写成
count=5;
两者的效果是一样的, Flash在第一次使用这个变量的时候自动定义这个变量, 而且根据所赋的值的类型确定变量的数据类型。但有经验的程序员都明白, 先声明后使用的严谨编程习惯, 对减少编程错误、 维护复杂程序等方面是非常有意义的做法, 当前绝大多数编程语言都逐渐摒弃了非严谨模式, AS3因向下兼容的需要而保留了这个选项。
3) 第三段示例代码
程序说明:
寻找一个1000以内的, 能被7整除而且二进制数的第四位是0第五位是1的数字。
新建Flash文档, 输入以下代码:
var testNumber;
var count = 0;
do {
count++;
//随机产生一个1~1000之间的整数
testNumber = Math.round(Math.random()*1000);
} while (!correctNumber(testNumber));
trace("找到一个能被7整除而且二进制数的第四位是0第五位是1的数字: \r"+testNumber);
trace("总共循环了\""+count+"\"次");
function correctNumber(para1:Number) :Boolean {
if (para1%7 == 0 &&(para1>>3)%4 == 2) {
return true;
} else {
return false;
}
}
按Ctrl+Enter测试影片。会得到如下的输出结果:
找到一个能被7整除而且二进制数的第四位是0第五位是1的数字:
693
总共循环了"5"次
代码说明:
这段代码的执行过程是先随机生成一个1~1000的整数, 然后判断它是否满足给出的条件, 如果不是, 那么重新生成一个随机数, 重新判断, 直到找到一个满足条件的数字, 最后输出这个数字以及循环的次数。
这段代码包含以下知识点:
u 自定义函数
u 逻辑运算符
u 复合逻辑关系
u 关系运算符
u 位运算符
u 转义字符
现在来解释一下其中的一些关键代码:
testNumber=Math.round(Math.random()*1000);
这里再次使用了Math对象的两个方法, 用来产生一个1000以内的随机整数。
回到示例代码, 看看下面这行代码:
while (!correctNumber(testNumber));
这是do while循环结构中的条件部分。它调用了一个自定义函数correctNumber(), 它有一个数值类型的参数, 当参数不是目标数值, 则函数返回值为false时, 由于进行了非运算( !) , 条件变成true, 程序进入下一次循环, 即继续执行do语句后面的代码, 直到当参数就是目标数值, 函数返回值为true, 进行非运算之后变成false, 不满足循环条件, 才跳出循环。
自定义函数:
函数correctNumber()实现了是否是所要数字的判断, 是这段程序的重要组成部分。使用函数能够提高代码的可读性和可维护性, 一般在如下情况下使用函数:
u 代码的输入和输出比较简单而中间过程比较复杂。使用函数使得在直观上把实现的细节隐藏, 提高了代码的可读性。
u 在多个地方都要使用到相同的代码, 或者只有参数不同的代码。就是说这段代码是为了完成某个常见的任务。例如在一个拼图游戏里面, 点击任意一个方块都会执行相应的移动( 或者不移动) 方块的操作。初学者往往习惯于把相关程序放在每个方块对象上。这造成代码的大量冗余, 可维护性差。而聪明的方法是将相应的操作写成一个函数, 然后经过对象的事件处理函数调用这个函数, 并将被点击对象的标识符( 自定义) 属性作为这个函数的参数。
u 某一大段代码是为了完成某个单一的任务。这同样是为了提到代码的可读性。经验表明, 每个程序块在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, 否则返回false
A||B( 或)
只要A、
展开阅读全文