1、第8章 使用ActionScript创建交互式动画,8.1 Flash脚本语言基础 8.2 时间轴控制 8.3 按钮事件 8.4 利用play、stop、nextFrame、prevFrame语句结合按钮控制影片播放 8.5 利用navigateToURL语句连接到网页文件 8.6 制作个性化鼠标指针 8.7 利用startDrag和stopDrag制作可以拖动的影片剪辑 8.8 应用实例 8.9 习题与实验指导,主目录,8.1 Flash脚本语言基础,制作引人入胜的动画,需要用到动作脚本对动画进行编程控制。ActionScript3.0是Flash CS3的脚本语言,通过它可以实现用户与动画
2、的交互,制作各种特殊效果。,8.1.1 交互式动画原理,1. 交互式动画概述以往电脑制作的动画通常是不可交互的,动画一直播放,观众不能控制动画的进程,动画也只能按照从开头到结尾的顺序播放。而Flash CS3允许用户参与和控制播放的内容,这使得用户的主动性大大提高,用户由被动的接受信息变为主动的查找信息,这就是通常所说的交互性功能。而应用了交互功能的动画就叫做交互式动画。ActionScript 3.0是Flash CS3中的编程语言,它的结构与JavaScript基本相同。ActionScript采用的也是面向对象的编程思想,它是以关键帧为对象,采用事件响应来定义和编写ActionScrip
3、t,在Flash CS3中彻底地实现了面向对象的编程,这就是第三代的交互功能编程语言:ActionScript 3.0,对于有高级语言编程经验的用户来说,学习ActionScript 3.0是一件很容易的事。,2. ActionSscript 3.0新增功能ActionScript 3.0需要一个全新的虚拟机AVM2来运行,但本质上,它仍是ActionScript,在ActionScript 1.0和ActionScript 2.0中的许多命令和程序概念仍然非常好的适用于ActionScript 3.0。在应用中ActionScript 3.0有很高的功效,还有就是ActionScript 3
4、.0在Flash Player中的回放速度要比ActionScript 2.0代码快10倍。下面是一些ActionScript 3.0中的新特性: 运行时排错:错误会运行时抛出以帮助调试影片。 运行时变量类型检测:在回放时会检测变量的类型是否合法。 类封装:静态定义的类以增强性能。 方法封装:方法现在与它们相关的类实例绑定,因此在方法中的“this”将不会改变。 E4X : 一个新的,更易于操作的xml 正规表达式:支持本地化正规表达式。 命名空间:不但在xml中支持命名空间而且在类的定义中也同样支持。 int和uint数据类型:新的数据变量类型允许ActionScript使用更快的整型数据来
5、进行计算。 新的显示列表模式:个新的,自由度较大的管理屏幕上显示对象的方法。 新的事件类型模式:个新的基于侦听器事件的模式。,8.1.2 脚本编辑区的构成,1. 打开动作面板要实现动画的交互功能,就必须通过编写ActionScript语言来实现,这就要用到动作帧面板。 右键单击时间轴上需要添加动作脚本的某个关键帧,在弹出的快捷菜单中选择“动作”命令即可弹出动作帧面板。 单击选中时间轴上需要添加动作脚本的某个关键帧,选择“窗口”“动作”命令也可以打开动作帧面板。 选中时间轴上需要添加动作脚本的某个关键帧,按下F9快捷键也可以打开动作帧面板。 要开始写一个新脚本,选择“文件”“新建”“Action
6、Script 3.0文件”菜单命令。,2.动作面板的构成,ActionScript命令列表窗口,位置列表窗口,命令编辑窗口,8.1.3 语言的编写方式,编写Flash动作脚本并不需要对ActionScript有完全的了解,用户的需求才是真正的目标。脚本可以由单一命令组成,如指示SWF文件停止播放的命令;也可以由一系列命令和语句组成,如先计算条件,再执行动作。许多ActionScript命令都很简单,可用于为SWF文件创建些基本控件。其他一些动作要求创作人员熟悉编程语言,主要用于高级开发。学习ActionScript的最佳方法往往是创建脚本。可以在动作面板的帮助下建立简单脚本。一旦熟悉了在影片中
7、添加诸如play利stop这样的基础动作之后,就可以开始学习更多有关ActionScript的知识。要使用ActionScript的强大功能,最重要的是了解ActionScript语言的工作原理、ActionScript语言的基本概念、元素以及用来组织信息和创建交互影片的规则等。,1脚本的规划和调试在为整个影片编写脚本时,脚本的数量和变化可能都是巨大的。例如,可能需要考虑以下问题:决定使用哪些动作,如何建立更有效的脚本结构,以及在哪些地方放置脚本?所有这些问题都需要经过仔细规划和测试。特别是当影片变得越来越复杂时,这些问题更加显得突出。,2. AS3中脚本包的基本编写在以前的ActionScr
8、ipt 1.0 和 2.0 中, 有多种途径添加代码:在时间轴上,按钮上或影片剪辑剪辑的实例上,在影片剪辑的时间轴上通过include命令引入外部的as文件或class文件。但是 ActionScript 3.0 是完全基于类的,所以所有的代码都必须放置在类文件中。 【实例】创建一个包,显示100条随机直线。 (1)新建一个flash文档,并保存为“显示随机直线.fla”。 (2) 新建一个flash.as文档,保存为“显示随机直线.as”,并和“显示随机直线.fla”储存在同一目录下。 (3)在“显示随机直线.as”中输入以下代码:,package import flash.display.
9、Sprite; public class ExampleApplication extends Sprite public function ExampleApplication( ) graphics.lineStyle(1, 0, 1); for(var i:int=0;i100;i+) graphics.lineTo(Math.random( ) * 400, Math.random( ) * 400); (4)保存然后运行程序,浏览器会打开一个html 文件,显示一个swf 里画了100条随机直线。正如所看到的,当swf 被播放器载入后构造器就会被执行。,3. AS3中脚本类的基本编写
10、一般来说,一个.as文件中就一个类,但是在AS3中,现在允许在一个文件中定义多个类用来辅助主类。在.as文件中的辅助类,必须定义在类包以外,并只针对此文件中的主类和其他辅助类可见。例如:package class MyClass function MyClass() var helper:MyHelper = new MyHelper(); class MyHelper function MyHelper() var helper:HelpersHelper = new HelpersHelper(); class HelpersHelper function HelpersHelper ()
11、 ,4. 变量作用域修饰符(modifier) AS3的类修饰符在AS2的基础上增加了internal和final。 Internal::是默认的修饰,即缺省设定,它表示此类访问范围为同一个包以内(和Java的缺省的类修饰一样)。 Final:代表此类不可被继承。 另外,AS3还可以使用内部类,内部类在主类同一个文件里package大括弧的外面申明,它只能被申明为internal的。并且,这个内部类只能被主类或者同文件的其它内部类访问。 Public:定义的类或者属性可以在任何作用域内由任何来源访问。构造函数永远都是public的,Flex中的应用程序类(Application Class)和
12、Flash CS3中的文档类(Document Class)必须是public的。且不能缺省public这个关键词声明。 Protected:声明类似AS2的private,它定义的属性只能在自己子类中可见,而其它场合都是不可见的。这一点与Java等传统OOP语言类似。 Private:注意AS3的private和AS2的private大不相同,它定义的属性只属于自己,子类可以定义毫无牵连的同名属性。 Dynamic:动态(dynamic)类允许在运行时动态地添加属性,常见的动态类有MovieClip和顶级(top-level)的Array。如果您的自定义类要继承于动态类,那么请也定义为动态的
13、,不要省略dynamic关键词。如果您喜欢阅读英文教程,会看到很多“sealed class”,其含义即“非dynamic class”。只不过并没有sealed这个关键词(AS3中,类默认就是sealed的)。,8.1.4 脚本元素,1. 动作 动作是指定一个动画在播放时做某些事情的一些语句。例如,gotoAndPlay把播放头送到指定的帧或标签。 2. 参数 参数可以把值传递给函数。例如,下面的Hello函数使用两个值,由参数firstName和hobby接收:Function Hello(firstName,hobby) HelloText=Hello,+firstName+很高兴见到你
14、+ hobby; 3. 类 类是可以创建的数据类型,用以定义新的对象类型。要定义对象的类必须先创建一个构造函数。 4. 常量 常量是不能改变的元素。例如,常量“10”总是具有相同的意思。常量在比较值时很有用。,5. 结构体结构体是用来定义类的属性和方法的函数。例如,以下代码通过创建称为Circle的构造函数来创建一个新的圆类: Function Circle(x,y,radius) this.x=x;this.y=y;this.radius=radius; 6 数据类型数据类型是一组值和对这些值进行运算的。例如:字符串、数值、逻辑值(true和flase)、对象和影片剪辑等。 7. 事件事件是
15、指软件或硬件发生的事情,它要求Flash应用程序予以响应。例如,单击鼠标或按下键盘键之类的事件称做用户事件,因为它是由于用户直接交互操作而发生的。Flash Player自动生成的事件(例如影片剪辑在舞台第一次出现)称做系统事件。为使应用程序能够对事件做出反应,必须使用事件处理函数。事件处理函数是与特定对象和事件关联的动作脚本代码。例如,当用户单击舞台上的某个按钮时,可以将播放头前进到下一帧。动作脚本提供了以下几种不同的方法来处理事件:事件处理函数方法、事件侦听器以及按钮和影片剪辑事件处理函数。,8. 表达式表达式是语句中能够产生一个值的任何一部分。 9 函数函数是可以用来传送参数并能返回值的
16、可重用代码块。例如,getProperty函数用于传送属性名和电影剪辑实例名,然后返回这些属性的值;getVersion函数返回当前正在插放动画的Flash播放器的版本。 10 事件处理程序事件处理程序是一种特殊的动作,用来处理和管理事件,例如,onClipEvent就是ActionScript的事件处理程序。 11. 标识符标识符是用来标明变量、属性、对象、函数或方法的名字。第一个字符必须是字母下划线()或美元符号()。每个后续字符必须是字母、数字、下划线(或美元号() 如,FirstName是一个变量名。 12. 实例实例是属于某个类的对象。个类的每个实例包含该类的所有属性和方法,所有电影
17、剪辑都是MovieClip类的实例,均拥有该类的属性(all alpha和visible)和方法(如gotoAndPlay和getURL)。 13 实例名称实例名称是在脚本中指向电影剪辑实例的唯一名字。例如,在图符库中的一个主图符可以称为counter,在动画中该图符的两个实例可以取实例名“P图层1”和“P图层2”。,14. 对象属性的集合。每个对象都有自己的名称和值。对象允许用户访问某些类型的信 息。例如,ActionScript的预定义对象Date就提供了系统时钟方面的信息。 15. 方法指定给对象的函数在函数被指定给对象之后,该函数就可以被称为是该对象 的方法。 16. 属性定义对象的a
18、ttributer(属性)。例如,所有影片剪辑对象都具有对visible(可见性) 属性,通过该属性可以决定影片剪辑是否显示。 17. 包 使用包,可以通过有利于共享代码并尽可能减少命名冲突的方式将多个类定义捆绑在一起。包可用于组织类文件。 18. 命名空间 使用命名空间,可以控制标识符(如属性名和方法名)的可见性。命名空间可用于管 理各个属性和方法的可见性。,本章目录,8.2 时间轴控制,8.2.1 stop、play语句,play利stop命令是一对作用相反的命令,在动画播放的过程中,如果没有特殊的说明,动画将沿着时间轴面板上的帧播放下去。使用play和stop命令,用户可以控制动画在指定
19、位置的播放和停止。play和stop命令没有参数,其语法为:play ()和stop ()。,使用 ActionScript 可以创建脚本来通知 Flash Player 在发生某个事件时应该执行什么动作。当播放头到达某一帧,或当影片剪辑加载或卸载,或用户单击按钮或按下某个键时,就会发生一些能够触发脚本的事件。,8.2.2 goto语句,goto命令是无条件跳转语句,它不受任何条件的约束,可跳转到任何地方。即在Flash CS3中,它可以不受约束地跳转到任何场景的任意一帧。在Flash CS3中,goto命令有两种基本的跳转模式: gotoAndplay(scene,frame):从当前帧跳转
20、到新的帧以后,继续进行播放。 gotoAndstop(scene,frame):从当前的帧跳转到新的帧以后,停止播放。它经常用于播放完一段完整的动画以后,跳转到一个选择菜单界面,然后用户可以选择另一个动画来播放。 其中: scene为可选字符串,用于指定播放头要转到的场景的名称,可以为空。 frame为一个表示播放头将转到的的帧编号,帧名称或者表达式。,8.2.3 nextFrame和prevFrame语句,nextFrame用于指定时间轴上的播放头跳至下一帧,并停在该帧,其语法格式如下:nextFrame();nextFrame()里的参数可以是数值,如nextFrame(10);表示停在从
21、当前帧往下的第10帧处。prevFrame语句与nextFrame正好相反,prevFrame用于指定时间轴上的播放头跳至前一帧,并停在该帧,其语法格式如下:prevFrame();,8.2.4 nextScene和prevScene语句,nextScene():进入下一个场景,并停止在第一帧处。PrevScene():进入上一个场景,并停止在第一帧处。,8.2.5 stopAllSounds语句,stopAllSounds命令用于停止所有正在播放的声音。该命令也没有参数,其语法为:stopAllSounds ();,本章目录,8.3 按钮事件,8.3.1 基本事件的处理,1. 事件和事件处理
22、函数事件可以引发Flash去运行某些动作,而捕捉并且处理该事件的程序,称为“事件处理函数(event handler)”。有些事件是由用户所引发的,有些则是系统本身触发的。Flash影片在播放过程中会产生各种不同的事件,例如,每当播放头播放到另一帧时,会产生“进入帧(enterFrame)”事件;当用户调整影片窗口的大小时,会产生“调整大小(resize)”事件如果不加以理会这些事件,也就是没有编写对应的“事件处理函数”,这些事件将被忽略,Flash影片播放器将不会有任何反应。,ActionScript 3.0中事件处理与之前版本的区别ActionScript 3.0 之前的 ActionSc
23、ript 版本中提供许多不同的方法来处理事件: on( ) 事件处理函数,可以直接放在 Button 和 MovieClip 实例上 。 onClipEvent( ) 处理函数,可以直接放在 MovieClip 实例上。 回调函数属性,例如 XML.onload 和 Camera.onActivity 。 使用 addListener() 方法注册的事件侦听器 。部分实现了 DOM 事件模型的 UIEventDispatcher 类。ActionScript 3.0 引入了单一事件处理模型,以替代以前各语言版本中存在的众多不同的事件处理机制。,8.3.2 按钮事件的动作脚本,1. Simple
24、Button类 在AS3.之前的版本中,按钮事件的脚本是直接添加在场景中按钮的某个实例上,但在AS3里,所有的脚本只能添加在时间轴的某一帧上。之前我们已经介绍过在AS3中没有类似onPress = function()这种事件监听方式,全部统一使用addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void, 此外AS3现在有一个新的类:SimpleButton(flash.display.
25、SimpleButton)。这个类允许你通过AS创建一个按钮。 2. ActionScript 3.0中按钮事件处理首先,定义一个函数,这是指定为响应事件而要执行的动作的方法。接下来,调用源对象的 addEventListener() 方法,实际上就是为指定事件“订阅“该函数,以便当该事件发生时,执行该函数的动作。一旦编写了事件处理函数,就需要通知事件源对象(发生事件的对象,如按钮)希望在该事件发生时调用函数。可通过调用该对象的 addEventListener() 方法来实现此目的(所有具有事件的对象都同时具有 addEventListener() 方法)。addEventListener(
26、) 方法有两个参数: 第一个参数是响应的特定事件的名称。同样,每个事件都与一个特定类关联,而该类将为每个事件预定义一个特殊值;类似于事件自己的唯一名称(应将其用于第一个参数)。 第二个参数是事件响应函数的名称。请注意,如果将函数名称作为参数进行传递,则在写入函数名称时不使用括号。,本章目录,8.4 利用play、stop、nextFrame、prevFrame语句结合按钮控制影片播放,在简单的动画中,Flash Player 按顺序播放 SWF 文件中的场景和帧。在交互式 SWF 文件中,观众可以用键盘和鼠标跳到 SWF 文件中的不同部分、移动对象、在表单中输入信息,还可以执行许多其它交互操作
27、。 【实例】制作按纽控制影片播放请参看教程,本章目录,8.5 利用navigateToURL语句连接到网页文件,navigateToURL( ) 函数的功能是,在包含 Flash Player 容器的应用程序(通常是一个浏览器)中,打开或替换一个窗口。 (1)语法格式: public function navigateToURL(request:URLRequest, window:String = null):void (2)参数:request:URLRequest URLRequest 对象,指定要导航到哪个 URL。window:String (default = null) 浏览器窗
28、口或 HTML 帧,其中显示 request 参数指示的文档。 可以输入某个特定窗口的名称,或使用以下值之一: “_self” 指定当前窗口中的当前帧。 “_blank” 指定一个新窗口。 “_parent“”指定当前帧的父级。 “_top”指定当前窗口中的顶级帧。如果没有为此参数指定值,将创建一个新的空窗口。 在独立播放器中,可以指定新的 (“_blank“) 窗口,也可以指定已命名的窗口。 其它值不适用。 【实例】创建一个按钮,并实现单击按钮时在一个新的IE窗口打开指定的网页。请参考教程。,本章目录,8.6 制作个性化鼠标指针,在Flash 中,可以设置通过鼠标事件来触发一系列其他事件,这
29、样就增强了Flash的交互性;也可以根据场景的需要来改变鼠标的形状或者制作鼠标跟随等效果。 【实例】制作个性鼠标指针请参看教程,本章目录,8.7 利用startDrag和stopDrag制作可以拖动的影片剪辑,影片剪辑是Flash影片中可以播放动画的元件,是唯一引用图形元素的数据类型。影片剪辑数据类型允许用户使用MovieClip对象的方法对影片剪辑元件进行控制。 1. startDrag() startDrag(lockCenter:Boolean = false, bounds:Rectangle = null):void允许用户拖动指定的 Sprite。 Sprite 将一直保持可拖动,
30、直到通过调用 Sprite.stopDrag() 方法来明确停止,或直到将另一个 Sprite 变为可拖动为止。 在同一时间只有一个 Sprite 是可拖动的。 参数 lockCenter:Boolean (default = false) 指定是将可拖动的 Sprite 锁定到鼠标位置中央 (true),还是锁定到用户首次单击该 Sprite 时所在的点上 (false)。bounds:Rectangle (default = null) 相对于 Sprite 父级的坐标的值,用于指定 Sprite 约束矩形。 2. stopDrag()结束 startDrag() 方法。 通过 start
31、Drag() 方法变为可拖动的 Sprite 将一直保持可拖动状态,直到添加 stopDrag() 方法或另一个 Sprite 变为可拖动状态为止。 在同一时间只有一个 Sprite 是可拖动的。 【实例】制作一个可以用鼠标拖动的影片剪辑。请参看教程,本章目录,8.8 应用实例,遮罩(mask)是一种常用的视图显示技术,在ActionScript3中,遮罩使用的是显示对象的mask属性,它的这一属性是使用getter和setter方法来实现的。在以下的实例中,我们将结合鼠标拖动的功能来实现遮罩的效果。,实例:擦窗效果,请参看教程,本章目录,8.9 习题与实验指导,本章目录,按照教材的“习题与实验指导”部分的要求,完成作业和实验。,