第1章 揭开actionscript的神秘面纱
actionscript是flash内置的编程语言,用它为动画编程,可以实现各种动画特效、对影片的良好控制、强大的人机交互以及与网络服务器的交互功能。
actionscript是一门吸收了c++、java以及javascript等编程语言部分特点的新的语言。actionscrip使用英文单词和元件提供了一种为flash影片设置指令的方法。它的存在确保了flash影片较之普通的按照线性模式播放的动画具备强大得多的人机交互能力。
可以为时间轴中的关键帧、按钮和影片剪辑添加actionscript。选中这些关键帧、按钮和影片剪辑,打开其动作面板,你就可以看到它们都添加了哪些脚本。
1.1 flash中的程序
交给计算机执行的指令集称为程序。程序的另一个名称叫做脚本。从现在开始,我们将这些指令集统称为脚本。
脚本都必须有它的运行环境,就actionscript来说,它的运行环境就是flash影片。actionscript可以指挥flash影片该做什么。在某些情况下,actionscript还可以指挥其他的东西,如用户的操作系统、浏览器等。但是actionscript最主要的用途还在于控制flash影片内部的东西。
短的脚本可以只有一行,长的脚本可以长达几千行。它们可以作用于flash影片的一个部分,也可以贯穿影片始终。有人把使用了脚本的整个flash影片看作一个程序,也有人把影片中单独出现的脚本看作一个程序。这两种看法都正确,因为一个单独的程序也可以被定义成若干小程序。
你可能对某些编程语言已经相当熟悉或者有所了解。例如广大网页设计者所熟知的javascript,以及另一种相似的语言vbscript,它们能用来编辑动态网页。html(hypertext markup language 超文本置标语言)是另一种特殊的语言,浏览器将按照它所包括的指令正确地显示文本和图片。
在学校里面,你可能接触过一些编程方面的课程,如basic、pascal、c、java等。
除html以外,以上提到的所有的语言都包含很相似的程序结构:循环、条件、变量等等。只要你知道了actionscript的特殊用法,你就可以将以前所学的编程知识利用起来。就算你以前从来没有接触过编程方面的知识,不用担心,我会将所有需要的知识都告诉你。
1.2 actionscript是从哪里来的
actionscript是从哪里来的呢?事实上它的确是从好几种程序语言中深化而来的。下面我们先花一点时间了解一下计算机语言的起源和发展。
当第一台数字计算机诞生的时候,唯一的编程语言是计算机的专用语言——二进制代码,即由数字1和0组成的编码。当由1和0组成的不同序列被输入到计算机中,计算机就会执行完全不同的操作。使用这种语言编写程序是相当费劲的,就算写一个简单的两数相加的程序,程序的长度也是相当惊人的。
为了避免每次都为两数相加的操作书写长长的二进制程序,有人书写了一种专门用于两数相加的代码,你可以方便地使用相同的代码实现任意两数的相加操作。接着,一些类似的函数诞生了,用它们可以处理所有的基本任务,如加、减、乘、除、比较、循环等等。从此以后,你可以使用这些事先编写好的函数执行几乎所有的操作了。
现代的计算机语言理解和使用起来较之二进制编码都已经容易了无数倍,其一,现代计算机语言与英语语法很相似,如“go”、“for”、“begin”、“if”以及+、-、=等,它们的含义和用法与现实中都相差不大。
basic、pascal等编程语言,几乎可以像英语句子一样阅读,所以学习和理解起来都非常容易。其他语言,如c、fortran,它们的功能更强一些,经验丰富的程序员可以用它们完成更复杂的任务。更多的语言居于以上两种语言之间,如c++、java和javascript,它们既有一定的可读性,也有较强的功能。actionscript与这些语言有更多的相似之处。
flash遵从ecma(european computer manufacturers association欧洲计算机工业协会)制定的标准,因此actionscript与ecmascript(ecma开发的一种语言)极其相似。所以与其说actionscript建立在javascript的基础上,不如说actionscript和javascript都建立在.
1.4 actionscript放在哪里
初学actionscript的flash爱好者最想问的问题恐怕是“actionscript应该放在哪里?”
flash是一种复杂的多媒体编辑环境,如果你曾经使用过flash,或者看过flash mx附带的教程,你就应该知道flash中的一些基本术语或元素。在flash的元素中有3个地方可以放置脚本。
1.4.1 时间轴
flash影片中的每个场景都有时间轴,时间轴上的每个关键帧都可以放置脚本。并且,你还可以在每一个关键帧的不同层上放置不同的脚本。
在主时间轴中放置脚本之前,需要先选择一个关键帧。启动flash时,时间轴中有一个空白关键帧,如图1-1显示了默认的空白关键帧和选中它时的状态。
当选中一个关键帧后,你就可以打开动作面板,查看里面的脚本或者开始编写你自己的脚本了。
有几种方法可以打开动作面板。你可以选择“窗口”→“动作”命令,或者按快捷键f9。
如果你对flash复杂的影片浏览器比较熟悉,你也可以在影片浏览器中查看整个flash影片所用到的脚本。打开影片浏览器的快捷键是alt+f3。
[next]如图1-2所示即为flash mx的动作面板。该动作面板被命令为“动作-帧”,这是因为其中的脚本将作用在帧上。如果是新建的一个影片,动作面板将是空的。后面我们将在动作面板中添加各种各样的脚本。第2章我们将看到如何使用动作面板。
时间轴中的脚本将在flash影片播放到脚本所在的关键帧位置时自动执行。例如,如果你为某一关键帧添加了stop()命令,当影片播放到那一帧位置时就会自动停止。要让影片继续播放,只有在其他的脚本中添加相应的命令。
在时间轴中添加脚本还有一个好处就是方便你在actionscript中使用函数。函数是可以重复使用的脚本代码,要想使整个影片都可以调用脚本中的函数,就必须将函数放置在主时间轴中。
1.4.2 按钮
flash中的元素又称作元件(symbol)。元件主要有3种:图形(graphic)、影片剪辑(movie clip)和按钮(button)。图形元件不能承载脚本,它们只能是简单的静态或动态图像。影片剪辑与图形元件类似,但是它可以承载脚本。
第3种元件就是按钮,按钮可以承载脚本。事实上,如果没有脚本,按钮几乎不会发挥什么作用。
要为按钮添加脚本,首先要在舞台中选中按钮,然后选择“窗口”→“动作”命令或按快捷键f9打开动作面板。
与帧动作面板相对应,选中按钮时动作面板的标题是“动作-按钮”。
你可能会认为,为按钮添加的脚本应该是在单击按钮时执行。其实,也可以为其他鼠标动作添加相应的脚本,如鼠标进入和移出按钮区域。按钮也可以响应按键动作,这使得我们可以方便地为按钮设置快捷键。
1.4.3 影片剪辑
影片剪辑不同于图形元件,可以为影片剪辑命名,为影片剪辑添加脚本。为影片剪辑添加脚本的方法与按钮类似。
为影片剪辑添加的脚本可以用来控制影片剪辑自身或控制时间轴中的其他影片剪辑。使用脚本可以判断影片剪辑出现在屏幕中的什么位置,你也可以用脚本来控制影片剪辑的重复播放等,进而控制整个动画。
除了可以为影片剪辑添加脚本,你也可以在影片剪辑内部添加脚本。影片剪辑其实也是一个单独的flash影片,在影片剪辑中有一条单独的时间轴,你可以像在主时间轴中添加脚本一样在影片剪辑内部的时间轴中添加帧动作脚本。同样地,你也可以将按钮放置到影片剪辑内部并为按钮添加脚本。也就是说主时间轴中的影片剪辑里面有子影片剪辑,子影片剪辑里面又有按钮,按钮中也可以有影片剪辑,如果需要,你都可以为它们添加脚本。
1.5 练习:你的第一段actionscript
下面来编写你的第一段actionscript,让你对actionscript有更深的了解。操作步骤如下:
(1)创建一个新的flash文档。
(2)选中时间轴中的第1帧,按f7键两次插入两个空白关键帧,这时时间轴中应有3个空白关键帧。
(3)在每一帧中绘制不同的图形。
(4)选择“控制”→“测试影片”命令或按ctrl+enter键测试影片,你会看到影片在这3个帧之间循环播放。
(5)回到主时间轴,选中第2个关键帧,按f9键打开动作面板。
(6)动作面板左边显示了可扩展的actionscript关键字目录。在“动作”/“影片控制”目录下面找到关键字stop并双击,脚本窗口将添加如下所示的一行语句:
stop();
(7)关闭动作面板,按ctrl+enter键测试影片,播放第1、2帧后影片会停止,你将看不到第3帧。
actionscript发挥了作用,它成功地阻止了影片无休止地循环播放这3帧。
第2章 flash mx的动作面板
动作面板是flash mx面板系统的一部分,actionscript程序员经常会用到它。为了成长为一名娴熟的flash编程高手,你有必要对flash的动作面板和在线帮助系统相当的熟悉。
动作面板的标准模式允许你从脚本目录中选择关键字并设置相应的选项,而专家模式为程序员提供了直接输入代码的自由。
2.1 了解动作面板
flash mx的面板系统向你提供了查看和设置flash中各种元素信息和属性的捷径。第一次启动flash mx的时候,系统将会询问你要使用flash做哪些方面的工作,然后为你设置默认的面板界面。你可以选择“窗口”→“面板设置”命令在不同的面板界面之间切换。与此同时,也决定了动作面板的大小,但是你可以将它改变成任何适合你需要的大小。
你可以通过键盘上的f9键随意显示或隐藏动作面板。显示动作面板后,你可以单击它的标题栏将它展开或折叠起来。你还可以拖动动作面板的左上角将它从flash的工作界面中分离出来。
动作面板有两种不同的工作模式。默认的模式是标准模式。在标准模式下,你必须从窗口左边的菜单中选择需要的关键字,而不能直接使用键盘输入脚本,因此可以有效避免即使是很细小的错误。
2.2 动作面板的标准模式
如图2-1所示为标准模式下的动作面板。
面板上部的下拉菜单显示了你当前所编辑的脚本的准确位置。图2-1中显示的是“帧动作脚本1 图层名称 图层1”,也就是说当前所编辑的脚本是作用于图层1的第1帧的。
面板左边显示了actionscript命令的分类目录,单击展开一个目录,你将看到它里面的子目录或命令。
面板的右边是一个空白文本区,它将显示你所选择的命令和函数。图2-2显示了你从左边的目录里面选择插入“动作”→“影片控制”中的goto命令后的动作面板。goto命令是通过双击鼠标添加到脚本中的。
面板右上部显示了goto命令的简单定义,下面显示了与goto命令相关的各种选项,包括“场景”、“类型”和“帧”等,就像是所选命令的参数设置区。参数设置区的状态会依据所选择actionscript命令的不同而发生变化。
[next]第一个需要设置的选项是选择gotoandplay命令还是选择gotoandstop命令。图2-2中选中的是“转到并播放”单选项,也就是gotoandplay。这两种命令是相似的,都是跳转到特定的帧,但是gotoandplay命令使影片从特定帧开始播放,gotoandstop命令使影片在特定帧上停止。
这个命令还需要附加一些信息才能正常工作。如,你想要使影片跳转到哪一帧,这一帧位于哪个场景,图2-2指定的是当前场景。在“类型”下拉菜单中可以选择指定特定帧的方式,你可以使用帧号、帧标签和表达式中的一种。图2-2选中的是帧号类型,这就要求你精确地指定帧的编号,如1。
在以上内容的下面显示了 和 两个按钮。它们使你可以快速地在脚本中插入和删除命令。但是这种方法很少使用,你可以通过左边的分类目录添加脚本,使用键盘上的delete或back space键删除不需要的命令。
和 按钮的右边还有几个功能不一的按钮。 按钮使你可以从脚本中查找文本, 按钮使你可以替换文本,使用 按钮可以插入目标路径, 按钮可以为你调试脚本设置断点, 和 按钮使你可以选择脚本的前一行或后一行。
在动作面板的底部你可以看到这样的一行:“第1行:gotoandplay(1);”,这是动作面板的状态行,它显示了当前选中的行号和该行的内容。
2.3 分类目录
动作面板左边的目录将actionscript的关键字有组织地分成几组,以使你更容易查找到需要的关键字的位置。以后我们会对每个组中的命令和符号作详细的讲解,下面先对其进行一下简要的介绍。
= 动作
在动作类中包含了最简单的actionscript命令。动作类提供了测试条件、循环、创建函数、复制和创建影片剪辑以及从服务器中获取数据等功能的命令。动作类中的命令是actionscript最重要的组成部分。动作类又分为影片控制、浏览器/网络、影片剪辑控制、变量、条件/循环、打印、用户定义的函数以及其他动作等子类。
= 运算符
它包括了各种数学和比较运算符,如+号,用于两数相加;==号,用于判断两数是否相等。运算符类下面又分为按位、比较、赋值、逻辑、算术和其他运算符等子类。
= 函数
使用函数可以转换数据或获取需要的信息,如获取flash的版本信息。你可以使用函数将字符串123转换成数字123。你还可以自定义需要重复使用的函数。在函数类下面主要有两个子类:数学函数和转换函数。
= 常量
常量类中包含了一些具有特定值的特殊关键字,如true、false、null和newline等。
= 属性
属性类中的关键字反映了flash中元素的相关信息。例如_x属性代表影片剪辑在屏幕中的水平位置。
= 对象
对象类是最复杂的一类,它包含了actionscript中的众多概念。所有的对象关键字被分成4个子类:核心、影片、客户端/服务器、创作。影片剪辑是影片类下面的一种,它包含了与控制影片剪辑相关的关键字。math是核心下面的一种,它包含了求平方根、正弦值等数学函数。
= 否决的
这一类中的关键字是已经作废但flash mx仍然支持的,在flash mx中请尽量避免使用,因为在以后的flash版本中将不再支持这些关键字。
= flash ui组件
这一类中的关键字包含了特殊功能的组件,如单选按钮、滚动条等。
= 索引
索引类将actionscript中的所有关键字按字母顺序排列。以上各类中的关键字都可以在索引类中找到。
动作面板中提供的关键字分类有时可以帮你方便地找到需要的关键字,但也有可能给你带来麻烦。如你可能认为表示影片剪辑水平坐标属性的_x应该在对象类的“影片”/“影片剪辑”/“属性”里面,但它却在属性类里面。你可能认为sqrt(开平方)应该在函数类中,但它却在“对象”/“核心”/“math”/“方法”下面。
2.4 使用flash的帮助系统
最好的程序员往往也要查阅一下工具书,flash中的帮助系统就是一本功能强大的工具书,所以在学习更多内容之前,先了解一下flash的帮助系统,将对我们的学习不无陴益。
flash使用工具提示和基于扩展html的帮助系统。为了对actionscript的使用更加娴熟,你就需要知道如何使用它们。
2.4.1 简单定义
如果你习惯使用动作面板中的关键字分类目录,你应该会注意到当你在左边的目录中选中某个关键字时,面板右边的上面部分会给出与所选关键字相应的简单定义。你会看见这样的句子:“要添加某项,可双击该项或将其拖动到脚本窗口。
例如选中goto命令时,你会看到这样的提示:“转到影片的指定帧。”它显示了该脚本的基本功能。
单击别的命令查看一下它们的定义,在学习下面的知识之前,你可以花些时间多看一下动作面板中的命令。
2.4.2 脚本参考面板
flash使用脚本参考面板帮助你记住actionscript的语法。可以选择“窗口”→“脚本参考”命令或按快捷键shift+f1打开脚本参考面板。脚本参考面板如图2-3所示。
脚本参考面板的左边与动作面板左边的脚本目录很相似。你也可以通过动作面板进入脚本参考面板,单击动作面板中的 按钮可以打开脚本参考面板,打开的脚本参考面板会自动显示你在动作面板中选中的命令。
2.4.3 html帮助文档
如果要获得actionscript命令更详细的说明,可以选择“帮助”→“动作脚本词典”命令,这将启动你的浏览器并打开如图2-4所示的页面。
图2-4 动作脚本词典
浏览器窗口的左边是所有actionscript命令和函数的总目录,在左边的条目上单击,窗口的右边部分会显示其详细的内容。
[next]选中每个条目时,右边窗口中通常会包括与该条目的说明以及它的使用范例。
在你以后使用flash的时候可能经常会用到帮助文档,所以请花一些时间了解它吧。
2.5 动作面板的专家模式
现在你已经了解了动作面板的标准模式,下面要向你推荐多数actionscript程序员使用的专家模式。
在专家模式下,你可以直接通过键盘输入脚本,而不需要从左边的目录中选择命令。这种模式下你可以在动作面板中输入任何东西,但也很容易导致错误。
在专家模式下,你仍然可以从左边的目录中选择并插入标准的actionscript命令、函数和运算符。当你记不确切一条命令的时候就可以使用这种方法。
2.5.1 切换模式
要从标准模式切换到专家模式,可以单击动作面板中的 按钮,或者单击动作面板右上角的 按钮,在打开的下拉菜单中选择“专家模式”命令。在动作面板获得焦点的情况下,快捷键ctrl+shift+n可以切换到标准模式,快捷键ctrl+shift+e可以切换到专家模式。
如图2-5所示为专家模式下的动作面板。在专家模式下,参数设置区、命令提示信息都没有了,脚本编辑窗口占据了动作面板右边的大部分。
图2-5 专家模式下的动作面板
从标准模式切换到专家模式是非常容易的,但是要从专家模式切换到标准模式则要求脚本中没有语法错误。比如说你不明白如何设置一些命令的参数,需要从专家模式切换到标准模式以使用标准模式下的提示,但是flash却不允许你进行切换,提示你“此脚本中有语法错误,必须在‘专家模式’下编辑它”;而当你知道如何设置参数并将脚本书写正确了,又不再需要切换到标准模式了。
2.5.2 动作面板的下拉菜单
动作面板的下拉菜单中有一些特别是在专家模式下编辑脚本时很有用的命令。
你可以使用查找和替换命令在代码中执行查找和替换操作。按快捷键ctrl+f可以打开“查看”对话框,按快捷键ctrl+h可以打开“替换”对话框。
“转到行…”命令可以快速转到并选中指定的行。
“语法检查”命令或按钮 可以对窗口中的脚本进行语法检查,如果没有语法错误,将提示你“此脚本中没有错误。”
通常,语法检查只能检查出代码中的明显语法错误,它并不能检查脚本是否能正确运行。经常会发生这样的事情,就是每一行的代码都是正确的,但所有的代码加在一起却导致了错误。
语法检查功能很实用,特别是对初学者来说,它能方便地检查出误用运算符或缺失括号等情况。
“自动套用格式”命令可以按预先设置的样式和缩进等设置脚本的格式。你可以选择“自动套用格式选项”命令,在“自动格式选项”对话框中重新设置要应用的格式,如图2-6所示。
图2-6 “自动格式选项”对话框
另外,选择“首选项…”命令可以设置动作面板中脚本代码的颜色、制表符宽度、字体等。你也可以在flash mx的菜单栏中选择“编辑”→“首选参数”命令,在打开的“首选参数”对话框中选中“动作脚本编辑器”选项卡,打开相同的对话框,如图2-7所示。
图2-7 “首选参数”对话框
为脚本上色有利于编写程序。使用这项功能时,你将看到actionscript中的关键字以一种颜色显示,而另外一些变量和常数以另外的颜色显示。这对初学者是很有帮助的。如正确输入关键字gotoandplay后,它马上会以蓝色显示。如果它的颜色没有发生变化,有可能就是你的输入有误。
动作面板下拉菜单中还有导入导出文件以及打印等命令,可以将使用外部的文本编辑器编辑好的脚本导入到动作面板中,或将动作面板中的脚本导出或打印出来。
从外部导入脚本的方法并不值得推荐,因为动作面板虽然不是最快捷的文本编辑器,但是在其中编辑actionscript是最好的,你可以在需要的时候参照脚本分类目录,可以即时的查看flash中的影片剪辑的名称,查看帧编号或帧标签。另外,你还可以快捷地切换到flash影片中要插入脚本的任何位置。
2.5.3 在专家模式下输入脚本
使用动作面板的专家模式要比标准模式容易得多,因为在专家模式下你只需要敲击键盘,而不需要在窗口中填写表格。专家模式下的动作面板就像一个简单的文本编辑器。
使用专家模式的缺点就是很容易出错。标准模式为你添加了很多限制,而在专家模式下你有可能键入不正确的命令或者将参数放错位置。
在专家模式下,你可以方便地将光标定位在合适的位置。但是flash也不能完全任你随心所欲,它会在你键入的同时自动调整脚本格式,将不同的关键字设置成不同的颜色。
你可以单击 按钮以检查脚本中的语法错误,单击 按钮以格式化整个脚本,如在需要的位置换行、设置空格和缩进等。
动作面板还有代码提示的功能。当你键入脚本的时候有时会出现一个提示菜单,你可以忽略它继续键入,或者从中选择需要的项目。单击 按钮可以显示代码提示。
2.6 练习:在专家模式下输入脚本
下面我们练习在专家模式下输入脚本。其操作步骤如下:
(1)新建一个文档。
(2)选择默认的场景1图层1中的第一个空白关键帧。
(3)按f9键打开动作面板。
(4)使用菜单将动作面板切换到专家模式。
(5)在脚本编辑区单击。
(6)键入下面的一行代码:
gotoandplay(5);
第3章
actionscript编程初步
计算机程序是由命令、函数、运算符、条件和循环等结构组成的。命令是为计算机下达的一系列指令,函数执行计算和返回值,通过运算符将若干数据以某种特定的方式结合起来,条件测试一个或多个值以返回一个为true或false的布尔值,循环结构使得程序能够重复执行一系列相同的指令。
[next]变量是存储数据的容器,变量有变量名和变量值。
编程是一项需要耐心的工作,首先你必须理解要用程序解决什么样的问题,然后需要将这个问题分解成若干步骤,将每个步骤再分成更小的步骤,直到每个步骤都小得很容易解决了为止。
程序编写好后,可能会存在许多漏洞或缺陷,所以你还需要对程序进行调试,直到程序能正确运行为止。
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
条件总是建立在比较之上的,你可以比较两个变量的值以判断它们是否相等;或者判断一个是否大于另一个,或是小于另一个。如果变量是字符串类型,你可以比较它们按字典顺序排列时的先后次序。
[next]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 trace; 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所示。 (6)按ctrl+enter键测试影片,因为舞台中没有任何图像,所以你将看到一个空白窗口,同时出现一个输出窗口,窗口中显示:i like actionscript!如图3-2所示。 和动作面板一样,输出窗口右上角也有一个下拉菜单,如图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); 如果你现在对对象、影片剪辑属性、层级之类的概念 在调试器窗口中可以设置断点,断点即是为某行代码添加的一个标记,当调试影片时,影片会自动在断点处停止,允许你查看当前包括变量值在内的的影片状态。使用断点可以使你逐行地执行代码,对每行代码的运行结果进行观察和分析。 初学actionscript的时候,你可能并不需要使用调试器;但是当你成长为一名经验丰富的程序员时,你就会发现它对你是非常有用的。 第4章 影片播放控制 控制影片播放流程的命令有许多,如下所示: stop:使影片停止在当前时间轴的当前帧中。 play:使影片从当前帧开始继续播放。 gotoandstop:跳转到用帧标签或帧编号指定的某一特定帧并停止。 gotoandplay:跳转到用帧标签或帧编号指定的某一特定帧并继续播放。 nextframe:使影片转到下一帧并停止。 prevframe:使影片回到上一帧并停止。 stop命令常常用在帧动作中,以使影片停 完成对按钮的创建后,可以单击舞台上方的场景名“场景1”回到主场景。 按f1或ctrl+l打开库面板,你将看到库中增加了一个按钮,用鼠标将它拖到舞台中。 4.2.2 为按钮添加脚本 要为按钮添加脚本,首先得选中该按钮,然后按f9键打开动作面板。你也可以在该按钮上单击鼠标右键,在弹出的快捷菜单中选择“动作”命令,这样也可以打开按钮的动作面板。 在专家模式下输入如下脚本: on (release) { trace("you are cliking me!"); } 按钮的脚本有特殊的语法,即必须以关键字on开头,以on开头的代码是一种事件处理函数,即当特定事件发生时要执行的代码。在这里,特定事件就是release(松开鼠标),它是按钮最常用的事件。 按钮事件还有press、releaseoutside、rollover、rollout、dragover、dragout以及keypress等。press是按下鼠标事件,它在release事件之前发生,releaseoutside是在按钮上按下鼠标,并且在按钮外松开鼠标的事件,rollover是鼠标指针移到按钮所在热区的事件,rollout是鼠标从按钮热区移出的事件,dragover是在鼠标指针位于按钮上方并已按下按钮的情况下,滑出按钮再滑回按钮的事件,dragout是当鼠标指针位于按钮内部,按下按钮然后滚动出按钮区域的事件,keypress是按钮响应在键盘上按下某些键时的事件。 某种事件的发生,会触发相应事件处理函数开始运行,上例中使用trace语句将事件信息发送到输出窗口中,使你可以更好地了解具体按钮事件的含义。 4.3 练习:演示文档 用flash可以实现演示文档的功能,演示文档相当于我们常说的幻灯片,它可以进行逐页展示。如果不使用脚本,flash动画会很快地播放每一帧,要用flash制作演示文档就得对flash添加控制命令。 我们用脚本使每一帧停止,要跳转到别的帧,就需要使用按钮。 制作演示文档的操作步骤如下: (1)启动flash mx,编辑前5帧。 (2)在文档中创建5个按钮,从库面板中可以看到它们。 (3)打开主时间轴第1帧的动作面板,其中添加了如下语句: stop(); 影片播放时,会停止在第一帧上。 (4)为图层2的第1帧和第5帧分别添加帧标签begin和end,如图4-3所示。 (5)选中第1帧中的“开始”按钮,打开其动作面板,在其中添加如下语句: on (release) { nextframe(); } 单击“开始”按钮,停止在第1帧的影片会跳转到第2帧并停止。 (6)分别在第2~4帧的相同位置添加按钮“首页”、“”、“末页”。由于第5帧后面没有别的帧,所以只添加“”按钮添加脚本: on (release) { prevframe(); } 单击“”按钮添加脚本: on (release) { nextframe(); } 单击“下一页”按钮,影片将从当前帧跳转到下一帧并停止。 (10)为所有“末页”按钮添加脚本: on (release) { gotoandstop("end"); } 单击“末页”按钮,影片将从当前帧跳转到帧标签为end的那一帧并停止,在此处也即是第5帧。 (11)按ctrl+enter键测试一下影片,单击各个按钮试一下效果。这些添加了actionscript的按钮是不是变得非常听话? 第5章 控制影片剪辑 影片剪辑是flash中最重要的一种元件,对影片剪辑的控制是actionscript的最重要功能之一。从根本上说,flash的许多复杂动画效果和交互功能都与影片剪辑的运用密不可分。 使用点语法或方括号可以定位影片剪辑。使用方括号时可以使用由变量表示的影片剪辑实例名,这是它相对于点语法的优点。 可以用脚本控制影片剪辑的各种动作,也可以在影片剪辑的事件处理函数中控制主时间轴和别的影片剪辑。影片剪辑最重要的两个事件是load和enterframe。 5.1 控制影片剪辑的播放动作 设想一个flash动画,它的主场景中只有一个帧,舞台中只有一个影片剪辑,影片剪辑中并没有actionscript。如何才能控制影片剪辑的播放动作呢? 要控制一个影片剪辑,首先应该为影片剪辑命名。容易混淆的是,库面板中的影片剪辑本身有一个名称,这里要命名的是场景中影片剪辑实例的名称。它们可以相同,也可以不相同。如果你在场景中创建了同样的影片剪辑的多个实例,那么就需要将每个实例以不同的名称命名,才能用actionscript对每一个实例进行控制。如果不需, 要对影片剪辑进行控制,也就不需要为影片剪辑的实例命名。 从本例文件中,你将看, 到库面板中只有一个影片剪辑rollmc,场景中创建了一个rollmc的实例。你还可以再从库中拖出若干个rollmc的实例将它们放置到场景中。 选中场景中影片剪辑rollmc的实例,打开属性面板,可以看到它被命名为roll,你同时可以看到该影片剪辑原来的名字rollmc,如图5-1所示。你也可以为它指定别的名称,也可以是rollmc,flash并不会混淆它们之间的区别。 实例名称可以在程序中用来指代该影片剪辑实例,如果要控制该实例,就需要在脚本中使用该名称。下面,我们就来看看如何 通过脚本控制影片剪辑实例roll。 分别选中场景中的4个按钮,打开它们的动作面板,查看其中的代码。 “stop”按钮: on (release) { roll.stop(); } 单击“stop”按钮使roll实例停 第6章 影片剪辑属性 通过调整影片剪辑的各种属性可以改变影片剪辑的位置和显示状态。_x和_y属性代表影片剪辑在场景中的水平坐标和垂直坐 标。_xscale和_width属性决定影片剪辑在水平方向上的显示宽度,_yscale和_height属性决定影片剪辑在垂直方向上的显示高 度。使用_rotation属性可以旋转影片剪辑。_alpha属性代表影片剪辑的透明度,_visible属性决定影片剪辑是否可见。使用关键字 _xmouse和_ymouse可以获取鼠标光标在屏幕中的坐标位置。 6.1 坐标 flash场景中的每个对象都有它的坐标,坐标值以像素为单位。flash场景的左上角为坐标原点,它的坐标位置为0,0,前一个0表示水平坐标,后一个0表示垂直坐标。flash默认的场景大小为550×400像素,即场景右下角的坐标为550,400,它表示距坐标原点的水平距离为550,垂直距离为400。 场景中的每一点都可以用坐标表示,如图6-1所示标注了若干点的坐标位置。 习惯地,水平坐标用x表示,垂直坐标用y表示。在flash中,分别用_x和_y表示x坐标值属性和y坐标值属性。例如,要在主时间轴上表示场景中的影片剪辑mymc的位置属性,可以使用下面的方法: mymc._x mymc._y 如果是在mymc自身的脚本中表示它的坐标,也以使用如下的方法: _x; _y; 或: this._x; this._y; 在属性面板和信息面板中都有可以查看和更改对象的位置。选择“窗口”→“信息”命令或按快捷键ctrl+i都可以打开信息面板。 6.6 缩放属性 影片剪辑的缩放属性包括横向缩放_xscale和纵向缩放_yscale。 _xscale和_yscale的值代表了相对于库中原影片剪辑的横向尺寸width和纵向尺寸height的百分比,而与场景中影片剪辑实例的尺寸无关。如库中影片剪辑元件的横向宽度为150,在场景中将它的实例宽度调整为10,在脚本中将_xscale设置为50,则它在影片播放时显示的横向宽度将是150的50%,即75,而不是50像素或10的50%。 当_xscale和_yscale是0~100之间的数时,缩小原影片剪辑;当_xscale和_yscale是大于100的数时,放大原影片剪辑;当 _xscale或_yscale为负时,将在缩放的基础上水平或垂直翻转原影片剪辑。 本例文件包含了一个矩形的影片剪辑和一幅图片,并将矩形所在图层作为遮罩层,如图6-4所示。 在矩形影片剪辑的动作面板中添加如下actionscript: onclipevent (load) { xs = _width; ys = _height; } onclipevent (enterframe) { _xscale = 100*(_root._xmouse-_x)/(xs/2); _yscale = 100*(_root._ymouse-_y)/(ys/2); } 在load事件中,用变量xs和ys取得影片剪辑初始状态下的宽度和高度值。在enterframe事件中,计算鼠标位置与矩形影片剪辑中心的距离,算出它与矩形宽度和高度值的比值,然后作为_xscale和_yscale的值。该动画实现移动鼠标位置以改变遮罩效果。 6.7 尺寸属性 上面例子中我们用到了影片剪辑的另两个属性:_width和_height。与_xscale和_yscale属性不同,_width和_height代表影片剪辑的绝对宽度和高度,而不是相对比例。 同样可以使用_width和_height调整影片剪辑的尺寸大小,如上例中的actionscript也可写成如下所示: onclipevent (enterframe) { _width = math.abs(_root._xmouse-_x)*2; _height = math.abs(_root._ymouse-_y)*2; } math.abs是一个内置函数,用以计算一个数或表达式的绝对值。因为与缩放属性不同,_width和_height的值不能为负,所以这时使用绝对值函数始终给出一个不为负的值。 此处用更简洁的脚本实现了与上例相同的效果。 图6-6 tabalball.fla文件的效果 该动画包含一支球杆影片剪辑stick,一个母球影片剪辑ball。在屏幕中移动鼠标,球杆会跟随鼠标转动,这是利用鼠标位置控制球杆的_rotation属性。球杆的影片剪辑中添加了一个隐性按钮(只有最后1帧作为热区,前面3帧都有为空,所以是不可见的),当单击球杆时,控制球杆影片剪辑向后播放,作回拉动作,再出杆击球。当球杆前端回到球的轮廓位置时,用球杆影片剪辑控制母球影片剪辑,将母球击出,然后将其自身的_visible属性设置为false,隐藏球杆。通过调整母球的_x和_y属性,实现母球的滚动、反弹等动作。在母球滚动时,分析母球位置以判断母球是否落袋,如果母球落袋,则使用trace语句给出提示“bad”,将母球重新置于初始位置。当母球停止滚动时,将球杆的_visible属性重新设置为true,并将球杆的位置设置为与母球相同,等待下一次击球。 球杆stick影片剪辑元件: (1)在stick影片剪辑元件第1帧的帧动作面板中添加如下语句: stop(); (2)在第2、10、12帧中添加动作,使球杆作回拉——出杆运动。第12帧时的球杆前端应与中心保持相当于母球半径长度即7.5像素的距离,在此帧时将母球击出。 (3)在第12帧的动作面板中添加如下actionscript: _root.motherball.v = 20; _root.motherball.dir = _root.stick._rotation; 上面的语句为motherball实例传送两个参数值v和dir,v代表了母球的运动速度,dir代表了母球的运动方向,它的方向与球杆的旋转方向相同。 (4)在第13~20帧添加过渡,使球杆击球后在场景中保留一段时间。 (5)在第20帧的动作面板中添加如下actionscript: _visible = false; 该语句将球杆自身隐藏。 (6)将第1帧中的球杆转换成按钮,选中该按钮,在动作面板中添加如下actionscript: on (release) { play(); } 单击该钮,球杆往后播放,作击球动作。 球杆影片剪辑实例: 在主场景中将球杆和母球放在左边,将它们的中心对齐。为球杆影片剪辑添加如下actionscript: onclipevent (load) { _x = _root.motherball._x; _y = _root.motherball._y; } onclipevent (mousemove) { xsm = _root._xmouse-_x; ysm = _root._ymouse-_y; if (xsm<0) { _rotation = math.atan(ysm/xsm)*(180/math.pi); } else { _rotation = math.atan(ysm/xsm)*(180/math.pi)+180; } } math.atan是flash的内置函数,用它求一个数或表达式的反正切值。math.pi是flash的内置常数,代表圆周率。使用math.atan计算出的反正切值的单位是弧度,而_rotation属性的单位是角度,所以要将其乘以(180/math.pi)以实现弧度到角度的转换。 在球杆影片剪辑的mousemove事件中,根据鼠标位置调整_rotation属性的值,使影片剪辑跟随鼠标转动,这也是鼠标跟随动画中的一种。 母球影片剪辑实例: 在母球影片剪辑实例的动作面板中添加如下actionscript: onclipevent (load) { v = 0; //初速度 dir = ""; //运动方向 vx = 0; //x方向分速度 vy = 0; //y方向分速度 slow = 0; //加速度 x0 = _x; //初始x位置 y0 = _y; //初始y位置 } onclipevent (enterframe) { //母球运动中 if ((dir != "") && (slow<100)) { //母球落袋 if (((_x<60) && (_y440) && (_y<85)) || ((_x265)) || ((_x>440) && (_y>265))) { _visible = false; trace("bad!"); dir = ""; v = 0; vx = 0; vy = 0; slow = 0; _x = x0; _y = y0; _visible = true; //在母球位置显示球杆 _root.stick._visible = true; _root.stick.gotoandstop(1); _root.stick._x = x0; _root.stick._y = y0; } //撞击球桌左边界 if (_x440) { _x = 440; dir = 180-dir; } //撞击球桌上边界 if (_y265) { _y = 265; dir = -dir; } //调整母球位置和速度 v0 = v*(100-slow)/100; vx = v0*math.cos((dir)/(180/math.pi)); vy = v0*math.sin((dir)/(180/math.pi)); _x += vx; _y += vy; slow++; } //母球减速完毕 if (slow == 100) { //在母球位置显示球杆 _root.stick._x = _root.motherball._x; _root.stick._y = _root.motherball._y; _root.stick._visible = true; //重置变量 dir = ""; v = 0; vx = 0; vy = 0; slow = 0; } } 第7章 影片剪辑方法 控制影片剪辑的方法很多,在actionscript中最常用和最有用的命令是duplicatemovieclip和attachmovie,它们用于复制和附加影片剪辑,这两个命令可以实现许多效果,如下雪、棋类、射击游戏等。 使用hittest方法可以代替按钮实现人机交互,从这里也可以看出影片剪辑有多么强大的功能。 startdrag和stopdrag用于对影片剪辑进行拖动,它们可以灵活地实现许多有趣的效果。 7.1 复制和附加影片剪辑 使用actionscript的一大理由便是它可以极大地提高工作效率,达到事半功倍的效果。本章要介绍的两个命令 duplicatemovieclip和attachmovie便是其中的典范。 7.1.1 array对象 array对象(动作面板的“对象”/“核心”目录)即数组,它用来记录成组的相关或相似变量。数组中的单个变量称为元素,数组中的每个元素对应一个索引,访问元素需要使用索引,索引需要用方括号括起来。 如下所示的actionscript创建一个空的数组: myarray = new array(); 如下所示的actionscript创建一个确定值的数组并在输出窗口中显示每个元素的值: weekday = new array("sun", "mon", "tue", "wed", "tur", "fri", "sat"); for (var i = 0; i<7; i++) { trace(weekday[i]); } 数组中还可以嵌套数组,即构成多维数组,如下所示: polyarray = new array(); for (var i = 0; i<3; i++) { polyarray[i] = new array(i*3+1, i*3+2, i*3+3, i*3+4); trace(polyarray[i][0]+" "+polyarray[i][1]+" "+polyarray[i][2]+" "+polyarray[i][3]); } 输出窗口中将显示: 1 2 3 4 4 5 6 7 7 8 9 10 7.1.2 复制影片剪辑 duplicatemovieclip动作(动作面板的“动作”/“影片剪辑控制”目录)和movieclip对象(动作面板的“对象”/“影片”目录)中的duplicatemovieclip方法都用于在影片播放时创建影片剪辑的实例,也即复制场景中的父影片剪辑以产生新的影片剪辑。它们和后面要介绍的attachmovie方法对于要在影片中重复产生较多相同图形或动画对象时非常有用,如棋类游戏、射击游戏、鼠标跟随、下雪等特效动画。 要使用duplicatemovieclip动作和movieclip.duplicatemovieclip方法,首先需要在场景中创建用来复制的父影片剪辑,并且在属性面板中为该父影片剪辑实例命名,该影片剪辑实例名称将作为duplicatemovieclip的参数之一。 在帧动作中使用duplicatemovieclip动作的方法如下所示: duplicatemovieclip("parentmc", "childmc", 10); 其中,第1个参数parentmc是父影片剪辑的唯一标识符,第2个参数childmc是复制产生的新影片剪辑实例的唯一名称,第3个参数10是新影片剪辑的深度级别(level)。深度级别的概念与层类似,较高深度级别中的图形会遮挡住较低深度级别中的图形,影片剪辑所在的深度级别越高就越贴近我们的视线。在同一个深度级别中只能有一个影片剪辑实例,如果在同一深度级别中添加多于一个影片剪辑实例,新的影片剪辑实例将替换掉旧的影片剪辑实例。 复制产生的影片剪辑实例与父影片剪辑实例的位置是重叠在一起的,所以一般还需要调整新影片剪辑实例的坐标等属性,以使其按照需要显示,如下所示: _root.parentmc._visible = false; duplicatemovieclip("parentmc", "childmc", 10); _root.childmc._x = 275; _root.childmc._y = 200; 运行以上脚本,屏幕中只能看到新影片剪辑实例,而父影片剪辑实例不见了。从这里也可以看出,父影片剪辑实例的属性并不会影响到复制产生的新实例。 通常情况下,可以用与下面类似的方法复制多个影片剪辑实例: _root.parentmc._visible = false; n = 50; for (i=0; i duplicatemovieclip("parentmc", "childmc"+i, 10+i); _root["childmc"+i]._x = 25+10*i; _root["childmc"+i]._y = 8*i; } 在父影片剪辑中使用movieclip.duplicatemovieclip方法如下所示: onclipevent (enterframe) { this.duplicatemovieclip("childmc", 10); _root.childmc._x += 150; } 它比duplicatemovieclip动作少了第1个参数,即不需要父剪辑名称。如果以上脚本不是在父剪辑而是在别的影片剪辑中,只需要将this换成父剪辑的实例名称即可。 7.1.3 附加影片剪辑 attachmovie方法也是在影片播放时创建影片剪辑的实例,它与duplicatemovieclip不同的是,attachmovie方法不需要使用父影片剪辑,而是将库中影片剪辑的实例附加到场景中。 要使用attachmovie方法,首先需要在库面板中为要附加到场景中的影片剪辑添加链接。为影片剪辑添加链接的方法如下: (1)在库面板中要添加链接的影片剪辑上单击鼠标右键,在弹出的快捷菜单中选择“链接”命令。 (2)系统弹出“链接属性”对话框,如图7-1所示。 (3)在“链接:”后选中“为动作脚本导出”复选框,“为运行时 为影片剪辑添加链接后,就可以在动作脚本中调用它,如下所示: attachmovie("blackchess", "chess1", 100); 第1个参数即在库面板中添加的链接名称,第2个参数和第3个参数的意义和使用方法与duplicatemovieclip中相同位置的参数类似。 在使用attachmovie方法将影片剪辑实例附加到场景中后,该实例将默认出现在场景左上角,即坐标原点的位置,所以仍然需要调整它的位置等属性。 7.1.4 删除影片剪辑 通过以上方法创建的影片剪辑实例都可以使用removemovieclip动作(动作面板的“动作”/“影片剪辑控制”目录)或 movieclip对象的removemovieclip方法删除,如下所示: n = 50; for (i=0; i removemovieclip(_root["childmc"+i]); } 7.2 练习:动态添加影片剪辑 本例是一个运用了duplicatemovieclip和attachmovie命令的鼠标跟随特效动画, 本例使用attachmovie命令将鱼附加到场景中的,使用duplicatemovieclip命令复制荷花影片剪辑以调整它的深度级别,使其保持在鱼的上面。 该文件只有两层,图层1用来处理鱼,图层2用来处理荷花。场景中只添加了荷花影片剪辑,它的实例名称与元件名称同为picmc。在库面板中为鱼的身体元件设置了链接,链接标识符与元件名称相同。 (1)在图层1的第1帧添加如下actionscript: unit = 20; //鱼的分段数:20 v0 = 12; //鱼的游动速度 v1 = 2/3; //鱼身紧骤程度 v2 = 3; //鱼身大小递减速度 var x = new array(); //创建横坐标数组 var y = new array(); //创建纵坐标数组 for (i=1; i<=unit; i++) { if (i == 1) { attachmovie("head", "fish"+i, unit+1-i); //在第1节附加鱼头 } else if ((i == 4) or (i == 13)) { attachmovie("fin", "fish"+i, unit+1-i); //在第4和13节附加鱼鳍 } else { attachmovie("body", "fish"+i, unit+1-i); //在其他节附加鱼身 } _root["fish"+i]._xscale = 50-v2*(i-1); //宽度递减 _root["fish"+i]._yscale = 60-v2*(i-1); //高度递减 _root["fish"+i]._alpha = 100-(100/unit)*i; //透明度递减 } (2)在图层1的第2帧添加如下actionscript: x[0] += (_xmouse-x[0])/v0; y[0] += (_ymouse-y[0])/v0; for (i=1; i<=unit; i++) { x[i] = x[i]+(x[i-1]-x[i])*v1; y[i] = y[i]+(y[i-1]-y[i])*v1; } //为数组元素赋值 for (i=1; i<=unit; i++) { _root["fish"+i]._x = (x[i-1]+x[i])/2; _root["fish"+i]._y = (y[i-1]+y[i])/2; _root["fish"+i]._rotation = 90+180/math.pi*math.atan2((y[i]-y[i-1]), (x[i]-x[i-1])); } //确定鱼身各节坐标位置和旋转方向 (3)在图层1的第3帧添加如下actionscript: gotoandplay(2); 该行语句令影片回到第2帧重新确定鱼身各节的位置。 (4)将荷花影片剪辑picmc拖放到图层2,并在属性面板中将其实例命名为picmc。选中该影片剪辑实例,在其动作面板中添加如下actionscript: duplicatemovieclip("picmc", "pic", 30); 该行语句复制荷花,并将其深度级别设为30。因为在鱼身各节中,鱼头的深度级别最高,为20,这里只要是一个大于20的数即可将荷花置于鱼的上面。 (5)按ctrl+enter测试影片。 第8章 响应键盘 有4种方法可以检测键盘上的按键动作。第1种方法是使用按钮,第2种方法是使用key对象,第3种方法是使用键盘侦听,第4种方法是使用影片剪辑的keyup和keydown事件处理函数。 8.1 通过按钮检测按键动作 在按钮的on事件处理函数中不但可以对鼠标事件作出响应,而且可以对键盘事件作出响应。如在按钮的动作面板中加入如下所示的代码,在敲击键盘上的a键时输出窗口中将提示:a is pressed。 on (keypress "a") { trace("a is pressed"); } 检测键盘上的字母键时,字母都应为小写。如果要检测键盘中的特殊键,如方向键,flash中有一些专门的代码来表示它们,如表8-1所示。 表8-1 键盘中的特殊键 如要检测键盘上的键,可以使用下面的actionscript: on (keypress "") { trace("end is pressed"); } 您可以在一个按钮中加入若干个on函数,也可以在一个on函数中结合多种事件,这使您可以为按钮定义快捷键,如下所示: on (release, keypress "") { _root.mymc.prevframe(); } 上面的语句实现单击按钮或按键盘上的左方向键,控制影片剪辑mymc回退1帧。 8.2 影片剪辑的keyup和keydown事件 影片剪辑包含两个与键盘相关的事件keyup和keydown,使用它们也可以实现对按键事件的响应,如下所示: onclipevent (keydown) { trace(key.getascii()); } 函数key.getascii返回与按键相对应的ascii码。ascii码是一个整数,键盘上的每个字符对应一个ascii码,如字母a对应的ascii码为65,b对应的ascii码为66,a对应的ascii码为97, b对应的ascii码为98,+对应的ascii码为43等。只有字符才有ascii码,键盘上的功能键没有ascii码。 如果需要在输出窗口中输出与按键相对应的字符,可以使用string对象的fromcharcode函数将ascii码转换成字符,如将上例的trace命令改成如下所示: trace(string.fromcharcode(key.getascii())); string对象见动作面板的“对象”/“核心”目录下面。 8.3 key对象 利用按钮检测按键动作很有效,但是并不利于检测持续按下的键,所以不适合于制作某些通过键盘控制的游戏。 这时,您就需要用到key对象。key对象包含在动作面板的“对象”/“影片”目录下面,它由flash内置的一系列方法、常量和函数构成。使用key对象可以检测某个键是否被按下,如要检测左方向键是否被按下,可以使用如下actionscript: if (key.isdown(key.left)) { trace("the left arrow is down"); } 函数key.isdown返回一个布尔值,当该数中的参数对应的键被按下时返回true,否则返回false。常量key.left代表键盘上的左方向键。当左方向键被按下时,该函数返回true。 key对象中的常量代表了键盘上相应的键,如表8-2所示。 表8-2 key对象中的常量 key.backspace key.enter key.pgdn key.capslock key.escape key.right key.control key.home key.shift key.deletekey key.insert key.space key.down key.left key.tab key.end key.pgup key.up 以上是键盘上的功能键,那么如何表示键盘上的字母键呢?key对象提供了一个函数key.getcode来实现这一功能,如下所示: if (key.isdown(key.getcode("a"))) { trace("a is pressed"); } 8.4 键盘侦听 假设在影片剪辑的onclipevent(enterframe)事件处理函数中检测按键动作,而影片剪辑所在的时间轴较长,或计算机运算速度较慢,有可能出现这种情况,即当在键盘上按下某个键时还未来得及处理onclipevent(enterframe)函数,那么按键动作将被忽略。 还有一个问题就是,在某些游戏(如射击)中,我们需要按一次键就执行一次动作(发射一发子弹),即使长时间按住某个键不放也只能算作一次按键,而key对象并不能区别是长时间按住同一个键还是快速地多次按键。 在解决这个问题,就需要用到flash mx中的第3种方法:键盘侦听。when it comes to listening for key presses您可以使用 “侦听器(listener)”来侦听键盘上的按键动作。 要使用侦听器首先需要创建它,您可以使用如下所示的命令来告诉计算机您需要侦听某个事件: key.addlistener(_root); key.addlistener命令将主时间轴或某个影片剪辑作为它的参数,当侦听的事件发生时可以用这个参数指定的对象来响应该事件。 上面的代码指定主时间轴来响应该事件。要让主时间轴对该事件作出响应,还需要设置一个相应的事件处理函数。 键盘侦听的事件处理函数有两个:onkeyup和onkeydown,如下所示: _root.onkeyup = function() { trace(key.getascii()); }; 您也可以使用影片剪辑作为侦听键盘的对象,只需要使用影片剪辑的路径代替_root作为key.addlistener命令的参数。 8.5 练习:键盘控制影片剪辑 文件如图8-1所示,可以通过键盘上的方向键控制影片剪辑运动。当敲击空格键时,瓢虫回到初始位置。 点击浏览该文件 图8-1 键盘控制影片剪辑 文件ladybug.fla,其中包含了一个影片剪辑ladybug。在主场景中选中瓢虫影片剪辑,打开其动作面板,其中添加了如下 actionscript: onclipevent (load) { x0 = this._x; y0 = this._y; } onclipevent (enterframe) { if (key.isdown(key.space)) { this._x = x0; this._y = y0; this._rotation = 0; } if ((key.isdown(key.left)) && (key.isdown(key.up))) { this._x -= 10/math.sqrt2; this._y -= 10/math.sqrt2; this._rotation = -45; } else if ((key.isdown(key.left)) && (key.isdown(key.down))) { this._x -= 10/math.sqrt2; this._y += 10/math.sqrt2; this._rotation = -135; } else if ((key.isdown(key.right)) && (key.isdown(key.up))) { this._x += 10/math.sqrt2; this._y -= 10/math.sqrt2; this._rotation = 45; } else if ((key.isdown(key.right)) && (key.isdown(key.down))) { this._x += 10/math.sqrt2; this._y += 10/math.sqrt2; this._rotation = 135; } else if (key.isdown(key.left)) { this._x -= 10; this._rotation = -90; } else if (key.isdown(key.right)) { this._x += 10; this._rotation = 90; } else if (key.isdown(key.up)) { this._y -= 10; this._rotation = 0; } else if (key.isdown(key.down)) { this._y += 10; this._rotation = 180; } if (this._x>550) { this._x = 0; } if (this._x<0) { this._x = 550; } if (this._y>400) { this._y = 0; } if (this._y<0) { this._y = 400; } } 当敲击空格键(key.isdown(key.space))时,影片剪辑回到初始位置;当敲击不同的方向键或方向键组合时,相应调整影片剪辑的_x、_y和_rotation属性,从而实现以键盘控制影片剪辑。 第9章 输入文本和字符串 flash中的文本形式有3种,即静态文本、动态文本和输入文本。输入文本可以接受用户输入,这也是响应键盘事件的一种。输入文本是一种人机交互工具,输入文本作为变量可以被actionscript识别。 有许多方法可以操纵string(字符串)对象,如使用运算符“+”连接字符串,使用substring和substr函数从目标字符串中截取子字符串,使用indexof函数确定匹配字符串在目标字符串中的位置等。 9.1 输入文本 flash中的文本形式有3种,即静态文本、动态文本和输入文本。输入文本可以接受用户输入,这也是响应键盘事件的一种。 3种形式的文本都是由文本工具 创建的,要创建输入文本,首先要使用文本工具绘制一个文本框,然后在属性面板中将该文本框的类型设置成输入文本,如图9-1所示,与输入文本对应的属性面板如图9-2所示。 在输入文本的属性面板中,除可以设置一般的文本格式外,还可以单击 按钮将文本显示为html格式,单击 按钮为文本添加边框,在 后面的下拉列表框中设置文本的换行格式或将文本设置成密码显示。 输入文本最重要的是变量名,如图9-2所示中的“变量”文本框,其中的myinputtext即是该输入文本的变量名。输入文本变量和其他变量类似,变量的值会呈现在输入文本框中,输入文本框中的值同时也作为输入文本变量的值,它们之间是等价的。 如在场景中绘制了一个变量名为myinputtext的输入文本框,然后在主时间轴的帧动作面板中添加如下actionscript: key.addlistener(_root); _root.onkeydown = function() { trace(_root.myinputtext); }; 以上脚本创建一个键盘侦听器,当按下键时即将输入文本myinputtext中的内容显示在输出窗口中。测试一下您可以看到,输出窗口不会漏掉输入的每个字符,并且每输入一个字符即输出一行。 9.2 字符串 字符串是一种特殊类型的数据,对字符串可以进行多种操作。 9.2.1 连接字符串 要连接两个字符串,可以使用“+”运算符。如下所示: var mystring = "hello"; mystring += " world."; trace(mystring); 输出窗口中将输出如下所示的字符串: hello world. 您可以在一行actionscript中使用多个“+”运算符,如下所示: mystr1 = "how"; mystr2 = "are"; mystr3 = "you"; mystr = mystr1+" "+mystr2+" "+mystr3+"?"; trace(mystr); 输出窗口中将输出如下所示的字符串: how are you? 9.2.2 截取字符串 从字符串中可以截取它的子字符串。例如,下面的脚本从字符串中截取第5到第14个字符组成的子字符串: mystring = "actionscript is so useful!"; childstr = mystring.substring(4, 14); trace(childstr); 截取字符串函数substring有两个参数,第一个参数表示要截取的字符串的开始位置,第2个参数表示要截取的字符串的结束位置。 输出窗口中输出如下所示的子字符串: onscript i 我们要截取的子字符串是从第5个开始,为什么substring的参数中要从4开始呢?这是因为在actionscript中,通常是从0开始计数的,即上面的字符串中第0位上是a,第1位上是c,以此类推。那么既然从0开始计数,第14个字符就应该是第13位,为什么第2个参数不是13而是14呢?这是因为substring的第2个参数是指要截取到的位置,即要截取的最后一个字符是它前面的一个字符,所以它应该比要截取的最后一个字符多一位。 还有一种方法可以截取字符串,这就是substr。substr与substring命令的区别在于substr的第2个参数代表要截取的子字符串的长度。如下所示的actionscript实现与前例相同的效果: mystring = "actionscript is so useful!"; childstr = mystring.substr(4, 10); trace(childstr); 在输出窗口中输出子字符串: onscript i 还有一个特殊的截取字符串的命令charat。charat可以从字符串的指定位置截取一个字符,如要从前面的字符串中截取第6位上的字符s,可以使用如下所示的actionscript: mystring = "actionscript is so useful!"; childstr = mystring.charat(6); trace(childstr); 输出窗口中将输出字符s。 9.2.3 字符串函数 string对象有很多内置函数,使您可以对字符串进行各种操作。 indexof方法用于从目标字符串中查找另一字符串的索引,即与另一字符串相匹配的子字符串的起始位置。如下所示: mystring = "macromedia flash mx"; mystr = mystring.indexof("flash", 0); trace(mystr); 以上脚本从目标字符串“macromedia flash mx”中查找字符串“flash”的位置,运行该脚本,输出窗口中输出11。 如果目标字符串中没有找到相匹配的字符串,将返回-1。 indexof的第2个参数表示从目标字符串中开始查找的起始位置,前例中的0表示从目标字符串的第1个字符开始查找。该参数可以省略,将默认从第1个字符开始查找。 与indexof函数相对的是lastindexof,用它查找在参数所指定的开始位置之前的最后一个子字符串的索引,即逆序查找。如下所示: mystring = "macromedia flash mx"; mystr = mystring.lastindexof("a", 12); trace(mystr); 运行该脚本,输出窗口中输出9。 如果将参数12改成13或更大的数,或将该参数省略,将返回结果13。 string对象的tolowercase函数实现将大写字母转换为小写形式,touppercase函数实现将小写字母转换为大写形式。如下所示: mystring = "macromedia flash mx"; mystr1 = mystring.tolowercase(); mystr2 = mystring.touppercase(); trace("original string : "+mystring); trace("lowercase string : "+mystr1); trace("uppercase string : "+mystr2); 运行该脚本,输出窗口中显示: original string : macromedia flash mx lowercase string : macromedia flash mx uppercase string : macromedia flash mx string对象只有一个属性,即length,它表示字符串的长度,即字符串中包含字符串的个数,如下所示: mystring = "macromedia flash mx"; trace(mystring.length); 运行该脚本,输出窗口中显示19,即该字符串中 用flash制作的表单 其中,第1个输入文本框采用单行格式,第2个输入文本框采用密码格式,第3个输入文本框采用多行格式,并设置了30像素的缩进。3个输入文本变量名分别为name、paword和words,使用actionscript分别控制3个文本框中的最大字符数。当单击按钮clear时,清除3个文本框中的内容,当单击按钮submit时,提交所填的内容。因为这里还没学到flash与服务器的交互,所以将用 户所填内容通过输出窗口显示出来。 打开文件form.fla,分别查看一下3个输入文本框的属性面板中的设置。 在主场景中新建一层actions,打开其动作面板,其中添加了如下actionscript: key.addlistener(_root); _root.onkeyup = function() { if (_root.name.length>8) { _root.name = _root.name.substr(0, 8); } if (_root.paword.length>16) { _root.paword = _root.paword.substr(0, 16); } if (_root.words.length>150) { _root.words = _root.words.substr(0, 150); } }; 以上脚本控制3个文本框中的最大字符数,当在文本框中输入的字符数超过了限制,则使用substr函数从输入的字符串中截取指定长度的字符串。 选中按钮clear,打开其动作面板,其中添加了如下actionscript: on (release) { _root.name = ""; _root.paword = ""; _root.words = ""; } 选中按钮submit,打开其动作面板,其中添加了如下actionscript: on (release) { trace("welcome "+_root.name+" !"); trace("your password is "+_root.paword+" ."); } 第10章 动态文本 在制作游戏的时候,有时需要一个文本框来记录用户的游戏得分,这个分数是根据游戏情况动态改变的。这时候,我们就需要用到动态文本。 动态文本与输入文本的区别在于它不能直接接受用户输入。 但是,动态文本可以用来显示不同样式和字体的文本。 10.1 动态文本 和输入文本一样,使用文本工具可以创建动态文本框,只需在属性面板中选择“动态文本”即可,如图10-1所示。 要让动态文本框动态地显示文本,就需要在属性面板中为其设置变量名。如图10-1所示,将动态文本的变量名设为 mydynamictext。在flash影片播放时,只需改变动态文本变量的值,就可以改变动态文本框中显示的文本。 动态文本有3种基本格式:单行、多行和多行不换行,它没有输入文本的密码格式。 属性面板中间有3个按钮,其中: = :可选,它决定了是否可以对动态文本框中的文本执行选择、复制、剪切等操作,按下表示可选。如果是输入文本,它是默认按下并且不可改变的,因为输入文本一定是可选的。 = :将文本呈现为html,它决定了动态文本框中的文本是否可以使用html格式,即使用html语言为文本设置格式。 = :在文本周围显示边框,它决定了是否在动态文本框周围显示边框。 怎样才能让动态文本框显示需要的文本呢?如下所示的脚本即在变量名为mydynamictext的动态文本框中显示 “welcome to actionscript!”: mydynamictext = "welcome to actionscript!"; 上面的脚本是加在动态文本所在的时间轴上的。 动态文本的使用虽然很简单,但是用它可以做许多事情。 10.2 html格式 html即超文本置标语言,它是网页格式的一种显示规范。在浏览网页时,浏览器通过解读html标记将网页中的各种元素显示成需要的样式。在flash中可以使用html来设置动态文本的格式。要使用html,首先需要按下属性面板中的 按钮。在flash中使用html标记为动态文本设置格式的actionscript如下所示: 点击放大 运行该脚本,动态文本框如图10-2所示。 flash中使用的并不是完整的html,而只是html中的一些标记,使用这些标记可以轻松地为动态文本设置各种格式。 flash mx中可用的所有html标记如下所示: = :粗体 = :斜体 = :下划线 = :设置字体 = :设置字号 = :设置颜色 = :网页超链接 = :定义段落 = :换行 10.3 从文本文件中获取变量 通过actionscript可以调用flash影片外部文本文件中的变量。从外部文件中获取变量的方法非常有用,它可以在不改变flash文件的基础上对flash影片的内容作出修改。例如要用flash制作一个天气预报动画,如果每天都对flash文件进行修改就太麻烦了。而使用外部变量就只需要对文本文件作出修改。 要从外部文件中获取变量需要用到的命令是loadvariables,如下所示: loadvariables("weather.txt", _root); 其中,第1个参数是flash影片要获取变量的文件位置,第2个参数是文本变量要加载到的位置,可以是_root,也可以是某个影片剪辑或深度级别。flash将来自外部文件中的变量值加载到与指定位置中具有相同变量名的文本字段中。 使用loadvariables命令要注意的是,指定的文本应以flash影片中的文本变量名开始,否则不能被加载。本例weather.txt中的内容如下所示: mydynamictext=today is friday,it's rainy! 打开文件loadvariables.fla,在主时间轴中有一个动态文本框,其变量名与weather.txt中的文本字段相同,当运行前面的脚本时,该文本框中显示: today is friday,it's rainy! 如果在文本文件中为变量指定多行字符串,flash将自动识别换行符,从而实现自动换行。 您可以修改文本文件中的内容,flash中动态文本显示的内容也将作出相应的改变。 10.4 练习:滚动新闻 下面利用loadvariables命令和字符串函数制作如图10-3所示的滚动新闻栏。 图10-3 滚动新闻栏 (1)新建一个flash文档并保存。 (2)在场景中绘制一个动态文本框,在属性面板中将其变量名设为text。 (3)选中文本框,按f8键将其转换为影片剪辑元件,在属性面板中将该影片剪辑实例命名为news。 (4)选中影片剪辑实例news,打开其动作面板,在其中添加如下actionscript: onclipevent (load) { loadvariables("news.txt", news); v = 0; } onclipevent (enterframe) { v++; if (v == 1) { text = text.substr(1, text.length-1)+text.substr(0, 1); v = 0; } } 在onclipevent(load)事件中使用loadvariables命令将外部文件news.txt中的文本调入到flash影片中。 变量v用来控制新闻滚动的速度。 在onclipevent(enterframe)事件中使用string对象的substr方法将text中的字符串分拆重组,以实现字符串滚动的效果。 (5)在与该flash文档保存位置相同的位置创建一个文本文档news.txt,在其中添加如下所示的字符: text=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 其中的text变量与flash中的动态文本变量名相同,其后的字符串可以根据需要添加。测试影片 第11章 math对象 作为一门编程语言,进行数学计算是必不可少的。在数学计算中经常会使用到数学函数,如取绝对值、开方、取整、求三角函数值等,还有一种重要的函数是随机函数。actionscript将所有这些与数学有关的方法、常数、三角函数以及随机数都集中到一个对象里面——math对象。 math对象是actionscript的一块敲门砖,只有掌握了它,才能真正对actionscript动画编程做到运用自如。 11.1 math对象的方法 11.1.1 math.abs math对象中集合了许多常用数学函数。math.abs就是用来计算一个数的绝对值,即一个数去掉正负符号后的值。其用法如下: x=math.abs(-9); 或: x=math.abs(num1-num2); 11.1.2 math.round math.round方法将一个浮点数四舍五入为最接近的整数,如: trace(math.round(9.4)); trace(math.round(9.5)); trace(math.round(-9.4)); trace(math.round(-9.5)); trace(math.round(-9.6)); 输出窗口中将显示: 9、10、-9、-9、-10 11.1.3 math.ceil、math.floor math.ceil方法取比一个浮点数大且最接近的整数,math.floor方法取比一个浮点数小且最接近的整数。如: trace(math.ceil(9.1)); trace(math.floor(9.1)); trace(math.ceil(-9.1)); trace(math.floor(-9.1)); 输出窗口中将显示: 10、9、-9、-10 11.1.4 math.min、math.max math.min方法取两个数中较小的一个数,math.max方法取两个数中较大的一个数,如: trace(math.min(9, 8)); trace(math.max(9, 8)); 输出窗口中显示: 8、9 11.1.5 math.pow math.pow方法用来计算一个数的乘方,它包含两个参数,第1个参数是底数(要乘方的数),第2个参数是幂(乘方数)。如计算5的3次方: trace(math.pow(5, 3)); 输出窗口中显示: 125 math.pow方法也可以计算一个数的开方,如计算125的开3次方: trace(math.pow(125, 1/3)); 输出窗口中显示 5 11.1.6 math.sqrt 除了用math.pow计算一个数的开方,还可以使用math.sqrt计算一个数的平方根,如计算64的平方根: trace(math.sqrt(64)); 输出窗口中显示 8 它等同于: trace(math.pow(64, 1/2)); 11.2 math对象的常数 math对象的常数有以下几个: = math.pi:圆周率(大约为3.141593)。 = math.sqrt1_2:1/2的平方根的倒数(大约为0.707107)。 = math.sqrt2:2的平方根(大约为1.414214)。 = math.e:欧拉(euler)常数,自然对数的底(大约为2.718282)。 = math.ln2:2的自然对数(大约为0.693147)。 = math.ln10:10的自然对数(大约为2.302585)。 = math.log2e:e的以2为底的对数(大约为1.442695)。 = math.log10e:e的以10为底的对数(大约为0.434294)。 其中math.pi用得较多,如下面的脚本将弧度值arcdegree转换为角度值angledegree: angledegree = arcdegree*(180/math.pi); 下面的actionscript将弧度1转换为角度: arcdegree = 1; angledegree = arcdegree*(180/math.pi); trace(angledegree); 输出窗口中显示: 57.2957795130823 11.3 三角函数 math对象中的三角函数有: = math.sin:正弦 = math.cos:余弦 = math.tan:正切 = math.asin:反正弦 = math.acos:反余弦 = math.atan:反正切 = math.atan2:从x坐标轴到点的角度 三角函数在actionscript中有着举足轻重的地位,它们在制作一些特效动画时将发挥重要的作用。 在程序语言中通常以x和y标记位置,但是在一个圆周上使用x和y来标记位置并不是很容易。三角函数在处理与圆周相关的位置参数时很有效。如用某个圆的圆心位置为(x0,y0),半径为r,可以用y0+r*math.sin(0)表示该圆水平直径右端点的纵坐标,用x0+r*math.cos(0)表示该圆水平直径右端点的横坐标。如图11-1所示用正弦函数和余弦函数标出了一个圆周上4个点的坐标。 如下所示的actionscript使影片剪辑绕圆周运动: onclipevent (load) { i = 0; r = 150; x0 = 275; y0 = 200; } onclipevent (enterframe) { i += 10; this._x = x0+r*math.cos(i/(180/math.pi)); this._y = y0+r*math.sin(i/(180/math.pi)); } 此时的影片剪辑是沿顺时针方向转动的,如要让它沿相反方向转动,只需将i += 10改写成i -= 10即可。 actionscript中的三角函数都是按照弧度计算的。一个完整圆周的弧度数为2*math.pi,大约是6.283185,而一个圆周的角度数是360。如要在三角函数中使用角度数,需要将其除以180/math.pi以转换为弧度数。 在上面的脚本中,i的值是递增的,而并没有限定在0~360之间。这是因为正弦函数和余弦函数是定义在负无穷~正无穷上的周期函数,它们的值是以360°为周期循环的。 11.4 字符串和数字的转换 在actionscript中,字符串和数字之间可以相互转换。在很多时候,将字符串转换为数字或将数字转换为字符串都是很有必要的。例如,在flash中有一个变量名为n的输入文本框和一个按钮,按钮中的actionscript如下: on (release) { trace(n+7); } 当在输入文本框中输入11,再单击按钮时,输出窗口将显示字符串“11”与字符串“7”相加的结果117,而不是数字11与数字7相加的结果8。这是因为从输入文本框中获得的是字符串,当表达式中有字符串和数字时,actionscript优先考虑字符串,将数字转换为字符串后再进行字符串运算。 为了将字符串转换成数字,可以使用actionscript提供的函数number,如将上例所示的脚本改写成如下所示: on (release) { trace(number(n)+7); } 当在输入文本框中输入11,再单击按钮时,输出窗口将显示结果18。 如果number函数中的参数不能转换成数字,则返回结果nan。 以“0x”开头的字符串将被解释为十六进制数。 对于布尔值,true将转换为1,false将转换为0。例如将上例所示的脚本改写成如下所示: on (release) { n = n>10; trace(number(n)); } 当输入的值小于等于10时,输出窗口中显示0;当输入的值大于10时,输出窗口中显示1。 除了number函数以外,函数parseint可以将字符串转换成整数,函数parsefloat可以将字符串转换为浮点数。如将上例所示的脚本改写成如下所示: on (release) { trace(parseint(n)+7); trace(parsefloat(n)+7); } 当在输入文本框中输入11.99,再单击按钮时,输出窗口中将显示18和18.99。 parseint和parsefloat在处理字符串时比number函数更专业一点,它们可以从字符串中取出能转换成数字的最长字符串进行转换,而忽略后面不能转换成数字的字符串。如将上例的脚本改写成如下所示: on (release) { trace(number(n)+7); trace(parseint(n)+7); trace(parsefloat(n)+7); } 当在输入文本框中输入11t7.9并单击按钮时,输出窗口中将显示 nan、18、18 parseint函数可以有两个参数,第2个参数在2~36之间,表示要转换的数字的基数,即进制数。如将二进制数1101转换为十进制整数: trace(parseint(1101, 2)); 输出窗口中显示13。 要将数字转换成字符串可以使用number对象(动作面板的“对象”/“核心”目录)的tostring方法。要使用tostring方法需要先创建一个number对象,其用法如下: mynumber = new number(15); trace(mynumber.tostring(2)); trace(mynumber.tostring(16)); tostring中的参数与parseint函数的第2个参数一样,都表示进制数。本例中的2和16分别表示将mynumber转换为二进制数和16进制数。运行脚本,输出窗口中显示 1111 f 如果省略参数,默认为十进制。 11.5 随机数 随机数在flash中的应用非常广泛。 在flash 5以前的版本中,使用random函数获取一个近似的随机数,如random(10)随机返回0~9这10个整数中的一个。但在flash mx中推荐使用math对象的random方法,即math.random(),该方法返回一个大于或等于0并且小于1的随机浮点数。 math.random方法比random函数得到的结果更精确,但它并不能直接产生一个整数。我们可以使用别的办法将 math.random方法产生的随机数转换为我们需要的整数,如要得到一个1~10之间的随机整数,可以使用如下所示的 actionscript: trace(math.floor(math.random()*10+1)); 11.6 练习:下雪 打开文件snow.fla,这是一个利用attachmovie和math.random方法制作的下雪效果,其中每一片雪花的大小、方向各不相同,如图11-2所示。 该动画中形状各异的雪花与math.random函数密不可分,下面来看它的制作方法。 (1)在库面板中为snow影片剪辑创建链接,其链接标识符为snow,如图11-3所示。 此主题相关图片如下: 图11-3 为影片剪辑添加链接 (2)将snow元件拖到场景中,选中该影片剪辑实例,在其中添加如下actionscript: onclipevent (load) { this._visible = false; v0 = 3; //速度 num = 50; //数量 vx = new array(); //记录水平速度的数组 vy = new array();成 //记录垂直速度的数组 for (var i = 1; i<=num; i++) { _root.attachmovie("snow", "snow"+i, i); //附加num个影片剪辑实例 scale = 100*math.random()+50; //随机设定实例大小 with (_root["snow"+i]) { //with语句 _xscale = scale; _yscale = scale; _x = 500*math.random(); //随机出现在影片水平宽度范围 _y = 400*math.random(); //随机出现在影片垂直高度范围 _rotation = 360*math.random(); //随机旋转一个角度 vx[i] = v0*math.random()+v0; //随机取得水平方向上的速度 vy[i] = v0*math.random()+v0; //随机取得垂直方向上的速度 } } } onclipevent (enterframe) { for (var i = 1; i<=num; i++) { with (_root["snow"+i]) { _x += vx[i]; //在水平方向上运动 _y += vy[i]; //在垂直方向上运动 if (_x<0) { //超出左边界,从右边界进入 _x = 500; } if (_x>500) { //超出右边界,从左边界进入 _x = 0; } if (_y>400) { //超出下边界,从上边界进入 _y = 0; } } } } 以上脚本除了用到数组、attachmovie、math.random等知识外,还用到了with动作。with动作用来为一组动作脚本指定一个对象,如本例用with动作指定对象_root["snow"+i],并在其后的大括号中对该对象的多种属性进行修改,从而避免了为每一个属性重复指定相同的对象,使脚本更紧凑和更简化。
评论