2024年1月19日发(作者:)

Flash AS入门教程

本文档前面大半截都在讲一些基础,如果大家觉得太啰嗦或者是已经掌握到这些内容了,可以直接跳过看最后的例子。有任何问题请联系我,谢谢~

Flash,中文字义是“闪”的意思,因此,做Flash相关工作的及Flash爱好者通常被称之为“闪客”。从1996年的Future Splash Animator(flash1)发售到现在的Flash CS3,flash一共发布了9个正式的版本。从flash4开始flash加入了编程的功能,到Flash5里编程功能得到了完善(即是As1.0),到Flash MX 2004的As2.0、现在最新Flash CS3的As3.0,ActionScript这个当初命名为动作脚本语言的Flash自带的程序语言在这些年间不断的壮大和完善,特别是最新的As3,已经达到和常规的如C++、Java等计算机语言能相提并论的地步了。

Flash常规元件共有三种:即图形元件(Picture)、按钮元件(Button)和影片剪辑元件(MovieClip通常简写为mc)

图形元件 可用于静态图像,并可用来创建连接到主时间轴的可重用动画片段。 图形元件与主时间轴同步运行。 交互式控件和声音在图形元件的动画序列中不起作用。 由于没有时间轴,在舞台上也没有实例名,图形元件在 FLA 文件中的尺寸小于按钮或影片剪辑,它在舞台上能够播放的帧数取决于它在时间轴里出现的帧数。个人的感觉好象是美工gg或mm都挺喜欢图形元件的(比方说李MM),因为图形元件可以在工作界面里很方便的预览,而as 程序员则基本是清一色的用mc。说实话我从未用过图形元件 。 ^_^

使用按钮元件 可以创建用于响应鼠标单击、滑过或其它动作的交互式按钮。 可以定义与各种按钮状态关联的图形,然后将动作指定给按钮实例。按钮一共有四帧:分别是普通、鼠标经过、点击和点击热区四个相对应的状态。

使用影片剪辑元件( 可以创建可重用的动画片段。 影片剪辑拥有各自独立于主时间轴的多帧时间轴,而且在舞台上拥有自己的实例名。您可以将多帧时间轴看作是嵌套在主时间轴内,它们可以包含交互式控件、声音甚至其它影片剪辑实例。当影片剪辑出现在舞台上,哪怕是它所在的时间轴的帧只有一帧,它仍然可以把自己内部的动画完全播完,这和图形元件非常的不同。

举个区别mc和picture的例子:

(图1)

舞台上有一个元件,它的本身有一段10帧的补间动画:

(图2)

如果舞台上这个元件是picture的话,生成的文件只能看到这个元件的第一帧,如果这个元件是mc的话 你可以看到它自身的补间动画。

Flash的常用名词:

舞台(Stage):台是您在创建 Flash 文档时放置图形内容的矩形区域。

帧(Frame):帧共分为三种即关键帧、空白关键帧和普通帧(一般帧)

帧率:即一秒内flash播放的帧数,通常更高的帧数会让flash显得更多加自然,当然代价也是使文件大小倍增(特别是逐帧动画),flash默认的12帧基本上是刚刚骗过人的眼睛,一个好的动画通常帧数也是比较足的。做游戏特别是动作游戏,至少也得24帧以上才基本过得去,好的游戏通常是要求30或45帧甚至60 帧。

关键帧:帧上面有实际内容的帧就是关键帧,只要有任何的东西在(哪怕是一个空白的mc),都会显示为关键帧

空白关键帧:顾名思义当然是没有内容的关键帧了

普通帧:普通帧不同于关键帧的地方在于普通帧显示的内容完全取决于它前面的关键帧的内容,普通帧不能独立的存在于一个单独的层上。

图层:图层可以帮助您组织文档中的插图。 可以在图层上绘制和编辑对象,而不会影响其它图层上的对象。 在图层上没有内容的舞台区域中,可以透过该图层看到下面的图层。需要说明一下的是图层和mc的深度息息相关的。越上面的图层所在的元件的深度也越高,不过在ActionScript里可以用语句动态的调整各元件之间的层级关系,请注意。

时间轴:时间轴用于组织和控制一定时间内的图层和帧中的文档内容。 与胶片一样,Flash

文档也将时长分为帧。 图层就像堆叠在一起的多张幻灯胶片一样,每个图层都包含一个显示在舞台中的不同图像。 时间轴的主要组件是图层、帧和播放头。

点语法:在 ActionScript 中,应使用点 (.) 运算符(点语法)访问属于舞台上的对象或实例的属性或方法。您还可以使用点运算符来确定实例(例如影片剪辑)、变量、函数或对象的目标路径。点语法表达式以对象或影片剪辑的名称开头,后面跟着一个点,最后以要指定的元素结尾。

路径:路径分两种:一是绝对路径二是相对路径。说这个之前先说几个flash里常用的关键字:this(当前)、_parent(父系)、_root(主时间轴,根轴。不管你的flash有多么的复杂,主时间轴只有一个,不过由于有时会将整个一个swf作为别一个swf元件载入,所以被

加载的swf的主时间轴也会发生变化,因此个人不太建议用_root。在as3中,它已被Adobe删除,并且没有替代者。)

绝对路径:相对好理解一些,也是初心者和菜鸟们最喜欢的为数不多的flash关键词之一。比方说主时间轴里有一个mc叫a,而另一个同在主时间轴上的影片剪辑b里有一个影片剪辑叫c的可以用绝对路径一下子就访问到a: _root.a,不管发起访问的对象是谁,只要用_root.a就一定可以访问到影片剪辑a,因为主时间轴只有一个,而不用考虑自己所处在的位置。

Ps:如果在代码中使用 _root,在将 SWF 文件加载到另一个 Flash 文档中时可能会遇到错误。在将 SWF 文件加载到一个不同的 SWF 文件中时,加载的文件中的 _root 可能指向该文件加载到的 SWF 文件的根范围,而不是像您所期望的那样指向它自已的根。这可能会导致不可预料的结果,也可能会导致完全无法运行。

相对路径:以当前为出发点,对其他对象访问的方式。还是舞台上还一个例子摆放方式:当b里的c要访问主时间轴上的a的时候应该这么写:

this._parent._parent.a

如果a要访问c的话应该这么写 this._parent.b.c

相对路径相对要复杂和麻烦一点,但很灵活,不过对于初学者来说要理清这个关系是有些头大的(习惯了就好)。

AS基础

做过Flash动画的Flash爱好者们都知道,要做好一个Flash动画,AS是必不可少的,即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简单的介绍一下AS的基本常识,更多多更详细的东西请参阅flash的自带的帮助,没有安装Flash的同学可以在172.31.14.190网站服务器03网站服务器01制作部资料站学习资源Flash as3帮助文件里找到中文版的CHM格式的flash帮助文件(学flash不安装flash? ^_^!)

变量的声明:

可以在时间轴中的帧上声明变量,直接在对象上声明,或在一个外部类文件中声明。

应使用 var 关键字定义变量并遵守变量命名约定。可以声明一个名为 n 的变量,如下例中所示:

var n:Number;

n=10;

其中var是声明变量的关键字,除了声明全局变量以外所有的变量都用这个关键字声明,as2对变量的声明要求不是特别严格,没有声明的变量也可以直接使用,但有时会出现一些问题,所以,要使用的变量还是老老实实的声明一下比较好。

n 就是变量名,开始为变量命名时要小心,因为尽管它们几乎可以用任意名称,但是仍然有一些规则需要遵循。变量名称仅能包含字母、数字和美元符号 ($)。变量名称不能以数字开头。变量必须是唯一的。(注意:理论上中文也是可以用做变量名的,不过由于flash对中文的支持并不是特别的地道,用中文做变量时经常会出现很多无法预计的问题,因此个人不建议用中文做为变量名)

冒号的后面就是这个变量的数据类型,常用的数据类型共有:Number(数字)、String(字符串)、Boolean(布尔)、Object(对象)、Array(数组)、MovieClip(影片剪辑)、Fuction(函数)等等。

Number 数据类型是双精度浮点数。数字对象的最小值大约为 5e-324,最大值大约为

1.79E+308。您可以使用加 (+)、减 (-)、乘 (*)、除 (/)、求模 (%)、递增 (++) 和递减 (--)

等算术运算符来操作数字。字符串是诸如字母、数字和标点符号等字符的序列。在

ActionScript 语句中输入字符串的方式是将其放在单引号 (') 或双引号 (") 之间。布尔值是 true 或 false 中的一个。布尔值经常与 ActionScript 语句中通过比较来控制脚本流的逻辑运算符一起使用。为了不影响节奏,其他几个相对复杂的数据类型放在后面讲„„下面接上面的例子:

后面的n=10就是给新声明的数字变量n赋值,也可以一步把声明和赋值完成:var

n:Number=10。如果没有数据类型的声明,比方说前面是这么声明的:var n=10(n是数字变量),在后面那怕再加上一句 n=”hellFire”(n又变成字符串变量了),flash在生成时也不会报错,但这个程序执行起来就非常的危险了,因此养成良好的变量声明习惯是编写as脚本基础。

变量的作用域

变量的范围是指识别(定义)变量的区域和可以引用变量的区域。变量在其中被识别的区域可能在某个时间轴中或在某个函数内部,也可能在整个应用程序中是全局已知的。

在使用 ActionScript 开发 Flash 应用程序时,了解变量范围是非常重要的。范围不仅表示可以在什么时间和位置引用变量,还表示一个特定的变量可以在应用程序中存在多长时间。在函数体中定义变量时,一旦指定的函数结束,变量就不再存在了。如果您试图在错误的范围内引用对象或引用已过期的变量,您的 Flash 文档中将会出错,这将导致出现意外情况或使功能受到破坏。

在 ActionScript 中有三种类型的变量范围:

全局变量和函数对于文档中的每个时间轴和范围均可见。因此,全局变量是在代码的所有区域中定义的。

时间轴变量可用于该时间轴上的任何脚本。

局部变量在声明它们的函数体(由大括号界定)内可用。因此,局部变量仅仅是在代码的一部分中定义的。

Ps:局部变量因为是临时的变量,它会随着函数的被调用被创建,会随着函数执行的结束而被自动删除,同时也可以释放它所占据的资源,尽可能的使用局部变量高级程序员节省资源的必备法宝;相反的 全局变量因为会自始到终的常驻在内存里面,它是蹲在那里不会走的,除非你结束当前正在执行的flash。所以有极端的说法是:全局变量是开发者的噩梦!。虽说有点过,不过也确实从侧面反映了一些事实。

关于运算符

本节介绍关于常见类型的运算符、运算符优先级和运算符结合律的一般规则。

运算符是指定如何组合、比较或更改表达式中的值的字符。表达式是 Flash 可以计算并返回值的任何语句。可以通过组合运算符和值或者调用函数来创建表达式。

++

--

+

!

typeof

void

*

/

%

+

-

<

>

<=

>=

instanceof

in

=

*=

/=

%=

+=

-=

<<=

>>=

>>>=

递增(前缀)

递减(前缀)

一元 +

一元 -(非)

返回类型信息

返回未定义值

乘法

除法

求模

加法

减法

小于

大于

小于或等于

大于或等于

检查原型链

检查对象属性

赋值

乘法赋值

除法赋值

求模赋值

加法赋值

减法赋值

按位左移位赋值

按位右移位赋值

按位无符号右移位赋值

&= 按位"与"赋值

^= 按位"异或"赋值

|= 按位"或"赋值

&& 逻辑"与"

|| 逻辑"或"

<< 按位左移位

>> 按位右移位

>>> 按位无符号右移位

& 按位"与"

^ 按位"异或"

| 按位"或"

?: 条件

由于运算符众多所以不一一举例说明了,各位可以看flash的帮助文档的“学习Adobe

Flash里的ActionScript2.0”里的“关于运算符”详细了解,没有安装Flash的同学可以在172.31.14.190网站服务器03网站服务器01制作部资料站学习资源Flash as3帮助文件里找到中文版的CHM格式的flash帮助文件。

保留字

命名实例和变量时,应避免使用保留字,否则会引起代码错误。保留字包括 ActionScript

语言中的关键字。

此外,不要用 ActionScript 2.0 语言中的任何字(称为语言构造)作为实例或变量名称。ActionScript 构造包括类名称、组件类名称、方法和属性名称以及接口名称。

永远不要使用不同的大小写来避免与保留字发生冲突。例如,将 TextField 类的一个实警例命名为 textfield(它不会与 TextField 发生冲突,因为 Flash 是区分大小写的)告

就是一种欠佳的编码做法。

add

catch

delete

eq

for

gt

import

intrinsic

new

onClipEvent

return

switch

try

and

class

do

extends

function

if

in

le

not

or

set

tellTarget

typeof

Break case

continue default

dynamic else

false finally

ge get

ifFrameLoaded implements

instanceof interface

it ne

null on

private public

static super

this throw

undefined var

void while with

根据 ECMAScript (ECMA-262) 第 4 版语言规范草案,在 Flash 中将下列字保留起来以供将来使用。请避免使用这些字,因为在未来版本的 Flash 中可能会使用它们。

as

char

enum

goto

native

synchronized

volatile

如何编写Flash代码

Flash的代码可以写在帧、按钮和mc上(注意:as3开始不能把代码写在元件上了!),方法:点击相应的区域后打开动作面板即可输入代码。当然还有外面的类文件里也可以写,写在图形元件里的代码是不会被执行的。

语句是告诉 FLA 文件执行操作的指令,例如执行特定的动作。例如,可以使用条件语句确定某一条件是否为 true 或是否成立。然后,代码可以根据条件是否为 true 执行指定的动作,例如函数或表达式。

例如,if 语句是一个条件语句,它可对一个条件求值以确定代码中应发生的下一个动作。

// if 语句

if (条件) {

// 语句;

}

另一个示例是 return 语句,该语句返回一个结果,并将其作为执行该语句的函数的值。

设置 ActionScript 格式或编写 ActionScript 时有多种不同的方法可供选择。您所用的构成语法的方式可能与其它编写 ActionScript 的程序员的方式不相同,例如,在代码中分隔语句的方式或放置大括号 ({}) 的位置。虽然可以使用几种不同的方法构成语句,且都不会破坏代码,但是要编写结构良好的 ActionScript,需要遵循一些一般的准则。

一行仅放置一个语句以增强 ActionScript 的可读性。下例中提供了我们建议使用和建议不要使用的语句:

theNum++; // 建议

theOtherNum++; // 建议

aNum++; anOtherNum++; // 不建议

abstract

const

export

is

package

throws

Boolean

debugger

final

long

protected

transient

bytes

double

float

namespace

short

use

将变量指定为单独的语句。请看下面的 ActionScript 示例:

var myNum:Number = (a = b + c) + d;

此 ActionScript 在代码中嵌入了一个赋值语句,使代码难于阅读。如果将变量指定为单独的语句,就可以增强可读性,如下例所示:

var a:Number = b + c;

var myNum:Number = a + d;

trace

trace() 语句向“输出”面板发送特定信息。 例如,测试 SWF 文件时,当按下按钮或播放帧时可以将结果发送到输出面板。 trace() 语句类似于 JavaScript alert 语句。

在脚本中使用 trace() 语句时,可以使用表达式作为参数。 在测试环境下表达式的值将显示在输出面板中。

出用法:trace(你想看到的输出结果),比如 有一个变量n的值为5,trace(n)后就能看到输出面板上输出一个“5”字。实践证明,trace是每一个as程序员的“居家旅行、谋财害命”必备法宝,特别是相对复杂一点的代码,当你不知道程序的具体执行的先后顺序及一些变量的当前值的时候,trace就显得尤为重要了。

常用语句

1.条件语句

if„else if(可选)„else„

可以使用 if..else if 条件语句测试多个条件。if..else if 语句中可以使用以下语法:

// else-if 语句

if (condition) {

// 语句;

} else if (condition) {

// 语句;

} else {

// 语句;

}

如果要检查一系列条件,就要在 Flash 项目中使用 if..else if 块。例如,如果要根据用户在一天中的访问时间在屏幕上显示不同的图像,可以创建一系列 if 语句来确定时间是清晨、下午、晚上还是夜间。然后显示适当的图像。

以下代码不仅测试 x 的值是否超过 20,还能测试 x 的值是否为负数:

if (x > 20) {

trace("x is > 20");

} else if (x < 0) {

trace("x is negative");

}

if语句是所有计算机程序语言里最基础的东西,相对来说也是最容易弄懂的语句,因为比较简单,所以这里就不啰嗦了„„„

使用 switch 语句

switch 语句创建 ActionScript 语句的分支结构。与 if 语句类似,switch 语句测试一个条件,并在条件返回 true 值时执行一些语句。

在使用 switch 语句时,break 语句指示 Flash 跳过此 case 块中其余的语句,并跳到位于包含它的 switch 语句后面的第一个语句。如果 case 块不包含 break 语句,就会出现一种被称为"落空"的情况。在这种情况下,接下来的 case 语句也会执行,直到遇到 break

语句或 switch 语句结束才停止。下例中演示了这种行为,其中第一个 case 语句不包含

break 语句,因此前两个 case(A 和 B)的代码块都会执行。

所有 switch 语句都应包含一个 default case。default case 应该始终为 switch 语句中的最后一个 case,而且应包含一个 break 语句来避免添加其它 case 时出现落空错误。例如,如果下例中的条件的计算结果均为 A,则 case A 和 B 的语句都会执行,因为 case A

缺少 break 语句。当一个 case 落空时,它没有 break 语句,但在 break 语句的位置会有一个注释,您在下例中 case A 的后面会看到这样一个注释。在编写 switch 语句时,请使用以下格式:

switch (condition) {

case A :

// 语句

// 落空

case B :

// 语句

break;

case Z :

// 语句

break;

default :

// 语句

break;

}

Flash里唯一的一个三元运算符 (?:)

如果您喜欢短代码形式,可以使用条件 (?:) 运算符,又称条件表达式。条件运算符允许您将简单的 if..else 语句转换为单行代码。该运算符有助于在实现同一效果的同时减少编写的代码量,但是它往往会使您的 ActionScript 更难以阅读。

下面的条件是用完整形式编写的,检查变量 numTwo 是否大于零,并返回 numOne/numTwo 的结果或字符串 carrot:

var numOne:Number = 8;

var numTwo:Number = 5;

if (numTwo > 0) {

trace(numOne / numTwo); // 1.6

} else {

trace("carrot");

}

使用条件表达式时,可以用以下格式编写同样的代码:

var numOne:Number = 8;

var numTwo:Number = 0;

trace((numTwo > 0) ? numOne/numTwo : "carrot");

ps: ?:是个人特别喜欢用的,因为它往往可以将if„else„的形式从n行缩短为一行,而且个人认为这个语句在稍微熟悉一下后并不象说明说的那么难懂。

如果说要比较一下这三个的利弊的话我个人的经验是:if„else„是最常用的,最中矩中矩的,也是最容易让人理解的,它的缺点就是让程序显得有些长和懒散;switch语句显得最大气,相对适合比较多并列条件的场合;而?:属于剑走偏锋,它能大大的缩短语句的长度,从而让冗长的程序能显得“精神”许多,缺点是稍稍让程序的可读性有所下降。为了程序的的执行效率,条件语句中更容易达成的部分通常应该写在前面。

2.循环语句

ActionScript 可以按指定的次数重复一个动作,或者在特定的条件成立时重复动作。循环使您能够在特定条件为 true 时重复执行一系列语句。在 ActionScript 中有四种类型的循环:for 循环、for..in 循环、while 循环和 do..while 循环。不同类型的循环的行为方式互不相同,而且分别适合于不同的用途。

多数循环都会使用某种计数器,以控制循环执行的次数。每执行一次循环就称为一次迭代。可以声明一个变量并编写一条相应语句:每执行一次循环,都让该语句对该变量递增或递减。在 for 动作中,计数器和递增计数器的语句都是该动作的一部分。

循环

for 循环

for..in 循环

while 循环

do..while 循环

说明

使用内置计数器重复动作。

迭代影片剪辑或对象的子级。

在某个条件成立时重复动作。

类似于 while 循环,差别仅在于它在代码块结束时计算表达式的值,因此该循环总是至少执行一次。

最常用的循环类型是 for 循环,它使一个代码块按预定义的次数循环。例如,如果您有一个项目数组,并且要对该数组中的每个项目执行一系列语句,则可以使用 for 循环,从 0 循环到该数组中的项目数。另一种有用的循环类型是 for..in 循环;如果要对一个对象中的每个名称/值对执行循环,然后执行某种类型的动作,就非常需要使用这种循环。这种循环在调试 Flash 项目和要显示从外部源(例如 Web 服务或外部 text/XML 文件)中加载的值时很有用。如果要循环一系列语句,但是不一定要知道需要循环的次数,则可以使用最后两种循环类型(while 和 do..while)。在这种情况下可以使用 while 循环,该循环在特定的条件为 true 时循环。

ActionScript 可以按指定的次数重复一个动作,或者在特定的条件成立时重复动作。使用

while、do..while、for 和 for..in 动作可以创建循环。

for

for 循环允许您对于特定范围的值迭代变量。for 循环在确切知道一系列 ActionScript

语句要重复执行的次数时非常有用。如果要在舞台上将一个影片剪辑复制特定的份数,或者对一个数组执行循环并对数组中的每个项目执行一项任务时,这种循环可能非常有用的。

for 循环使用内置计数器重复动作。在 for 语句中,计数器和递增计数器的语句都是该 for

语句的一部分。使用下面的基本格式编写 for 语句:

for (init; condition; update) {

// 语句;

}

必须在 for 语句中提供 3 个表达式:一个设置了初始值的变量,一个用于确定循环何时结束的条件语句,以及一个在每次循环中都更改变量值的表达式。例如,下面的代码循环 5 次。变量 i 的值从 0 开始以 4 结束,输出结果将是从 0 到 4 的 5 个数字,每个数字各占一行。

var i:Number;

for (i = 0; i < 5; i++) {

trace(i);

}

加强:

for是用的最多和最广的循环语句,很难想象一种程序语言没有for会是什么样子,它和条件的if语句一样属于所有程序语言都有的“全勤”代表,因此,掌握好for循环是非常重要的。为了说清楚一点这里举一个相对复杂一点的例子:套嵌循环

var n:Number;

var m:Number;

var a:Number = 0;

for (n=0; n<5; n++) {

}

trace(a);

//25;

这个例子有两个for循环,里面的m的for循环是被套在外面n的for循环里面的,当n循环一次时,里面的m循环就会执行5次,a的值会自动递加5次,当n循环满5次时,a的值已一共被递加了25次了,所以最终trace出a的值应该是25。不清楚的同学可以将上面的例子复制进flash的动作面板里执行一下。

使用 for..in 循环

使用 for..in 语句遍历(或循环 访问)影片剪辑的子级、对象的属性或数组的元素。子级(见前述)包括其它影片剪辑、函数、对象和变量。for..in 循环的常见用法包括循环执行时间轴上的实例或循环执行对象中的键/值对。循环执行对象可能是调试应用程序的一种有效的方法,因为它允许您查看 Web 服务或外部文档(例如文本或 XML 文件)返回的数据。

例如,可以使用 in 循环来循环访问一个通用对象的属性(对象的属性不按任何特定的顺序保存,因此属性将以不可预知的顺序出现):

var myObj:Object = {x:20, y:30};

for (var i:String in myObj) {

trace(i + ": " + myObj[i]);

}

for (m=0; m<5; m++) {

}

a++;

此代码将在"输出"面板中输出以下信息:

x: 20

y: 30

还可以循环访问数组中的元素:

var myArray:Array = ["one", "two", "three"];

for (var i:String in myArray) {

trace(myArray[i]);

}

此代码将在"输出"面板中输出以下信息:

three

two

one

使用 while 循环

使用 while 语句在条件成立时重复某动作,类似于 if 语句,只要条件为 true 就重复动作。

while 循环计算一个表达式的值,如果表达式为 true,则会执行循环体中的代码。如果条件计算结果为 true,在循环返回以再次计算条件前执行一条语句或一系列语句。条件计算结果为 false 后,则跳过语句或一系列语句并结束循环。在不确定要将一个代码块循环多少次时,使用 while 循环可能会非常有用。

例如,下面的代码将数字显示到"输出"面板中:

var i:Number = 0;

while (i < 5) {

trace(i);

i++;

}

您会看到以下数字显示到"输出"面板中:

0

1

2

3

4

关于 do..while 循环

可以使用 do..while 语句创建与 while 循环同类的循环。但是,do..while 循环中是在代码块结束时计算表达式的值(在代码块执行之后检查),因此该循环总是至少执行一次。只有条件计算结果为 true 时语句才会执行。

下面的代码显示了 do...while 循环的一个简单示例,即使条件不满足也会生成输出结果。

var i:Number = 5;

do {

trace(i);

i++;

} while (i < 5);

// 输出:5

复杂数据类型:

因为这几个数据类型都属于比较复杂的东东,所以它们的一些具体的操作方法请大家多看flash自带的帮助,没有安装Flash的同学可以在172.31.14.190网站服务器03网站服务器01制作部资料站学习资源Flash as3帮助文件里找到中文版的CHM格式的flash帮助文件,最后会有综合使用这些变量的例子加以说明。

数组(Array)

数组 是一个对象,其属性由表示该属性在结构中位置的数字来标识。实质上,数组是一系列项目。需要记住的重要一点是,数组中的各元素不必为相同的数据类型。可以在每个数组索引上混合使用数字、日期、字符串、对象,甚至添加一个嵌套数组。

下例是一个简单的月份名称数组。

var myArr:Array = new Array();

myArr[0] = "January";

myArr[1] = "February";

myArr[2] = "March";

myArr[3] = "April";

上面的月份名称数组还可以按以下形式重写:

var myArr:Array = new Array("January", "February", "March", "April");

或者,可以使用简化语法,如下所示:

var myArr:Array = ["January", "February", "March", "April"];

数组类似于一种数据结构。一个数组好比一座办公大楼,每一层都包含不同的数据片段(例如会计部 在 3 层,工程部 在 5 层)。同样,可以在单个数组中存储不同类型的数据(包括其它数组)。大楼的每一层可以包含多种内容(经理办公室

和会计部

可能都在 3 层)。

数组包含元素,这些元素对应于大楼的各层。每个元素都有一个数字位置(即索引,用于指代每个元素在数组中的位置。这类似于大楼中的每一层都有一个层号。每个元素都可以保存一个数据片段(可以是数字、字符串、布尔值,甚至数组或对象)或为空。

您还可以控制和修改数组本身。例如,可能要将工程部搬到大楼的地下室。数组允许您来回移动值,并且允许更改数组的大小(这类似于翻新大楼,加盖更多层或去掉一些层)。同样,可以添加或删除元素以及将值移动到不同的元素中。

因此,大楼(数组)包含多个层(元素),都是已编号的层(索引),并且每层都包含一个或多个部门(值)。

函数(Function)

方法和函数是一些可以在 SWF 文件中的任意位置重复使用的 ActionScript 代码块。您可以在 FLA 文件或外部 ActionScript 文件中编写自己的函数,然后可以从文档内的任意位置调用该函数。方法只是一些位于 ActionScript 类定义中的函数。您可以定义函数,对传递的值执行一系列语句。函数也可以返回值。在定义了函数后,就可以从任意一个时间轴中调用它,包括加载的 SWF 文件的时间轴。

函数分内置函数和自定义函数。

内置函数比如我们常用的:gotoAndStop()、gotoAndPlay()等等是flash内部已定义好了的了,我们可以在任何时候,任何地方对这些函数进行调用,而不用考虑这些函数是否已经声明、它在什么地方声明等。

自定义函数一种通常在 ActionScript 代码中创建用来执行所有类型操作的函数。在创建

SWF 文件时,将首先编译命名函数,这表示只要已在当前帧或前面的帧中定义了函数,就可以在代码中的任意位置引用该函数。例如,如果在时间轴的第 2 帧中定义了一个函数,就不能在时间轴的第 1 帧中访问该函数。

命名函数的标准格式如下所示:

function functionName(外部传入变量):返回值 {

// 函数块

//return 返回数据

}

自定义函数是特别重要的一个环节,是as程序高手和菜鸟的一个分水岭,相对的自定义函数也是flash as里比较难的部分,有兴趣的可以多看看c++或java的教程,个人感觉那些教程里说函数比flash里说得详细得多,大体上各种语言的函数的思路都可以通用,同时多看前辈高手们的代码也对自己提高整体实力有比较大的帮助。(如果你能看得懂得话)

影片剪辑(MovieClip)

影片剪辑就像自包含的 SWF 文件,这些 SWF 文件互相独立运行且与包含它们的时间轴无关。例如,假设主时间轴只有一个帧,而该帧中的影片剪辑有十个帧,则播放主 SWF 文件时,将播放影片剪辑中的每个帧。影片剪辑还可以包含其它影片剪辑,即嵌套剪辑。以这种方式嵌套的影片剪辑具有层次结构关系,其中父级剪辑 包含一个或多个子级剪辑。影片剪辑自己有很多属性:比如它的宽(width),它的高(height),它的透明度(_alpha)等等等等(太多无法一一例举)„„

您可以命名影片剪辑实例,以将它们唯一地标识为可使用 ActionScript 控制的对象。当您向影片剪辑实例提供实例名称 时,该实例名称即将其标识为 MovieClip 类类型的一个对象。您可以使用 MovieClip 类的属性和方法控制影片剪辑运行时的外观和行为。

影片剪辑是flash里最重要的一部分,影片剪辑自带的属性和函数都非常多,这里说几个最为常用的:

Play() 播放

Stop() 停止

gotoAndStop(n) 让播放头跳到第n帧并停止在这一帧上

gototAndPlay(n)让播放头跳到第n帧上并从这一帧继续往下面播。

onEnterFrame 此函数出现在时间轴上时会以(帧率.次/秒)的速度自动执行,是制作鼠标跟随、自定义缓动等都常用到的函数。需要注意的是这个函数因为会在一秒内执行十数次甚至数十次,因此对资源的占用是非常夸张的,不用的时候一定要用delete 等方法将其删除。

对象(Object)

在flash里,所有元件的最上级就是对象了,它是大哥的大哥,至尊的至尊。可以说:一切皆对象~

对象是属性的集合。属性 是用于描述对象的特性。例如,对象(如影片剪辑)的透明度是描述其外观的一个特性。因此,_alpha (透明度)是一个属性。每个属性都有名称和值。属性的值可以是任何 Flash 数据类型,甚至可以是 Object 数据类型。这样就可以使对象包含对象(即将其嵌套)。

若要指定对象及其属性,可以使用点 (.) 运算符。例如,在下面的代码中,hoursWorked 是

weeklyStats 的属性,而后者是 employee 的属性:

orked

ActionScript MovieClip 对象具有一些方法,您可以使用这些方法控制舞台上的影片剪辑元件实例。此示例使用 play() 和 nextFrame() 方法:

();

ame();

您也可以创建自定义对象来组织 Flash 应用程序中的信息。若要使用 ActionScript 向应用程序添加交互操作,将需要许多不同的信息:例如,可能需要用户的姓名、年龄和电话号码;球的速度;购物车中货物的名称;已加载的帧数;或用户上次所按的键。通过创建自定义对象,可以将信息分组,简化您的脚本撰写过程,并且能重新使用您的脚本。

下面的 ActionScript 代码显示了使用自定义对象组织信息的示例。它创建了一个名为

user 的新对象并创建了三个属性,name、age 和 phone,这些属性分别是 String 和 Number

数据类型。

var user:Object = new Object();

= "Irving";

= 32;

= "555-1234";

下面举一个简单的例子来综合说明一下:

西游老版官网flash导航实际界面

西游老版官网flash文件界面

舞台的背景上面上有六个导航mc还有一个游戏logo,两朵云悄悄的躲在左右两边。为什么不做六个按钮呢?因为六个主菜单按钮都有一个“鼠标移开,停在第二帧”这个效果,而按钮本身是“鼠标一移开就弹回到第二帧”,所以用灵活性更大的mc来做。

六个菜单按钮分别起名为:btn0、btn1、btn2、btn3、btn4、btn5 。一般取一系列大体功能接近的元件名的时候最好都用这种 英文+数字的方法比较好,这样做的好处是可以用循环语句很方便的遍历这几个元件,利于管理。两边的两朵云就命名为:cloud1和cloud2。时间轴上有很多图层,下面的都不用管它,我们只用管最上面的那个叫:Action的图层。

下面是第一帧的代码详解:

stop();

//停止播放,一般的有代码的文件第一帧都会停止播放头的播放。Flash的第一帧有人称之为:超级帧,它能做很多它兄弟姐妹都不会做的事,比如加进度条,读取xml,声明、初始化一系列的变量等等,本例虽说只有一帧,不会自动播放,不过习惯上还是应该加一个stop的说~

nu = false;

//本句的作用禁止右击后出现的“播放、快进”等控制菜单,防止玩家利用快进或播放等菜单命令看到他不应该看到的东西 ^_^!

Var root:Object = this;

//flash as2的this(当前)有时会有一些变化,因此在这里声明了一个对象变量替代当前

var btn_arr:Array = new Array();

var roll_arr:Array = new Array();

var url_arr:Array = new Array();

var btn_x_arr:Array = new Array();

//分别声明了四个数组来,其中btn_arr这个数组遍历访问舞台上的几个菜单按钮,现在刚生成还是空的;roll_arr用来保存6个布尔变量,这6个布尔变量是反映舞台上几个菜单按钮的鼠标悬停与否;url_arr用来接收所有的链接;btn_x_arr用来保存6个按钮的原始坐标,用以云朵和按钮的对齐,使用这几个数组都是为了方便用循环语句的遍历访问,减少代码量,让程序显得更加精神 - -!

btn_x_(153);

btn_x_(244);

btn_x_(361);

btn_x_(623);

btn_x_(730);

btn_x_(835);

//将6个数加入到btn_x_arr这个数组中

var url_0:String = "/";

var url_1:String = "/news/";

var url_2:String = "/info/info_";

var url_3:String = "/info/newplayer/newplayer_";

var url_4:String = "/info/wallpaper/";

var url_5:String = "";

var url_6:String = "/info/info_";

var url_7:String = "/info/info_";

var url_8:String = "/info/newplayer/newplayer_";

var url_9:String = "/pocketworld/";

//声明了10个字符串变量,一会会加入到url_arr数组中

var b0_roll:Boolean = false;

var b1_roll:Boolean = false;

var b2_roll:Boolean = false;

var b3_roll:Boolean = false;

var b4_roll:Boolean = false;

var b5_roll:Boolean = false;

//声明了6个布尔变量,一会会加入到roll_arr数组中

var cloud1_min:Number = -100;

var cloud2_max:Number = 1100;

//给两朵小云定义了两个数字变量,让它们分别在达到或超过这个量时触发相应条件

var no:Number;

//数字变量,用来让roll_arr里面的几个菜单按钮知道它自己是“老几”

var tem_n:Number;

//数字变量 用来接收最后一个被鼠标光顾的菜单按钮是“老几”

for (var i = 0; i<10; i++) {

url_(root["url_"+i]);

}

//利用一个for循环把全部的链接放入到url_arr里面

for (var i = 0; i<6; i++) {

roll_(root["b"+i+"_roll"]);

//用for6循环将6个变量放入到roll_arr数组里

btn_(root["btn"+i]);

//用for6循环将6个菜单按钮(其实是6个mc)放入到btn_arr数组里

btn_arr[i].no = i;

//给每一个菜单按钮(即是btn_arr的数组成员)增加一个属性让它记住自己是几,比如btn0.i=0,这样可以省略一些for循环

btn_arr[i].onRelease = function() {

if (t(root._xmouse, root._ymouse) || (this._name != "btn2" &&

this._name != "btn3")) {

getURL(url_arr[], "_blank");

}

};

//判断当前的菜单按钮是有下拉的没有,有则热区为菜单按钮元件里的mc”a”,没有则直接用当前作为热区,然后用自己的no变量索引到url_arr相应队伍成员,打开链接

btn_arr[i].onRollOver = function() {

for (var n in btn_arr) {

if (n != ) {

roll_arr[n] = false;

btn_arr[n].gotoAndStop(1);

} else {

roll_arr[n] = true;

tem_n = ;

}

}

};

}

//当某个菜单按钮被鼠标悬停时,把其他的菜单按钮全部归位(跳回第一帧),然后将 roll_arr数组对应的队列成员变为真,最后让tem_n获取当前是第“几”个菜单按钮正在做鼠标响应,然后让onEnterFrame接收到相应的变量值,让云朵做出相应的缓动动作来

function onEnterFrame() {

if (roll_arr[tem_n]) {

if (tem_n<3) {

if (cloud2._x

cloud2._x += (cloud2_max-cloud2._x)/5;

}

if ((btn_x_arr[tem_n]-cloud1._x)>3) {

var tm_n:Number = (btn_x_arr[tem_n]-cloud1._x)/5>2.8 ?

(btn_x_arr[tem_n]-cloud1._x)/5 : (btn_x_arr[tem_n]-cloud1._x>0 ? 2.8 : -2.8);

cloud1._x += tm_n;

} else {

cloud1._x = btn_x_arr[n];

roll_arr[tem_n] = false;

btn_arr[tem_n].gotoAndStop(2);

}

} else {

if (cloud1._x>cloud1_min) {

cloud1._x += (cloud1_min-cloud1._x)/5;

}

if ((btn_x_arr[tem_n]-cloud2._x)>3) {

var tm_n:Number = (btn_x_arr[tem_n]-cloud2._x)/5>2.8 ?

(btn_x_arr[tem_n]-cloud2._x)/5 : (btn_x_arr[tem_n]-cloud2._x>0 ? 2.8 : -2.8);

cloud2._x += tm_n;

} else {

cloud2._x = btn_x_arr[tem_n];

roll_arr[tem_n] = false;

btn_arr[tem_n].gotoAndStop(2);

}

}

}

}

//这个就是onEnterFrame函数根据不同的roll_arrr的队列里的布尔变量成员做出让两边不同的云,左飞-左出、右飞、右出的效果来

罗马不是一天建成的,as也不是一天就能学会的,最后祝各位好好学习、天天向上~!

高翔

2008.8.14.