ActionScript 3.0 是FLASH的内置脚本语言,它是面向对象的编程语言,通过ActionScript 的强大功能,可以创造出各种复杂的动画效果和网络应用程序。在Flash CS3中新增加了ActionScript 3.0 版本。由于ActionScript 3.0 对于初学者有一定的难度,为了让同学们更好地学习ActionScript 3.0脚本语言,现将有关ActionScript 3.0 基础的一些相关内容发布在下,请同学们下载学习:
类和面向对象编程
类(Class)和面向对象(Object Oriented),对于有些读者来说可能还没接触过而有些读者可能已经在 AS (或其它语言) 中使用过很多年了,如果你说你从没用过类,那你就错了,只要你在 Flash 中,写过代码,那么实际上就已经使用了类。类可以简单理解为一种对象, MovieClip 就是影片剪辑的类,而文本框、影片剪辑、按钮、字符串和数值等都有它们自己的类。
一个类最基本的两个部分:属性(数据或信息),行为(动作或它能做的事)。属性(Property)指用于保存与该类有关的信息变量,行为(Behavior)就是指函数,如果一个函数是这个类中的一部分,那么我们就称它为方法(Method)。
一个基本的类:
常用 Flash 的朋友都知道,我们可以在库中创建一个元件,用这个元件可以在舞台上创建出很多的实例。与元件和实例的关系相同,类就是一个模板,而对象(如同实例)就是类的一个特殊表现形式。下面来看一个类的例子:
package {
public class MyClass {
public var myProperty:Number = 100;
public function myMethod() {
trace("I am here");
}
}
}
先来说明一下这段代码。在这里有些新的知识,对于 AS 2 老手也如此:包的声明。包(Package),作用就是把相关的类进行分组。知道这一点就够了,我们不再进行深入的讨论,本书的示例甚至不会用到包。Package 这个关键字和一对大括号是必需有的,我们理解为默认包,紧随其后的就是类的定义。
另一个变化是 AS3.0 中的类拥有了访问关键字。访问关键字是指:一个用来指定其它代码 是否可访问该代码的关键字。 public (公有类) 关键字指该类可被外部任何类的代码访问。
本例中我们可以看到,这个类的名字为 MyClass,后面跟一对大括号。在这个类中有两种要素,一个是名为 myProperty 的变量,另一个是名为 myMethod 的函数。
包(Package)
包主要用于组织管理类。包是根据类所在的目录路径所构成的,并可以嵌套多层。包名
所指的是一个真正存在的文件夹,用 “.”进行分隔。例如,有一个名为 Utils 的类,存在于文件夹 com/ friendsofed/ makingthingsmove/ 中(使用域名作为包名是一个不成文的规定,目的是保证包名是唯一的)。这个类就被写成
在 AS 3 中,包名写在包的声名处,类名写类的声名处,例如:
package com.friendsofed.makingthingsmove{
public class Utils {
}
}
导入(Import)
想象一下,每次要使用这个类的方法时都要输入
com.friendsofed.makingthingsmove.Utils,是不是太过烦琐太过死板了。别担心,import 语句可以解决这个问题。在这个例子中,可以把下面这句放在 package 中类定义的上面:
import com.friendsofed.makingthingsmove.Utils;。
构造函数(Constructor)
构造函数是指一个名字与类名相同的方法。当该类被实例化时,该函数会被自动调用,也可以传入参数,例如: 首先,创建一个类:
package {
public class MyClass {
public function MyClass(arg:String) {
trace("constructed");
trace("you passed " + arg);
}
}
}
然后,假设工作在 Flash CS3 IDE(集成开发环境)中,在时间轴上创建该实例:
var myInstance:MyClass = new MyClass("hello");
结果输出:
constructed
you passed hello
继承(Inheritance)
一个类可以从另一个类中继承(inherit)和扩展(extend)而来。这就意味着它获得了另 一个类所有的属性和方法(除了那些被 private 掩盖住的属性)。所生成的子类(派生类)还可以增加更多的属性和方法,或更改父类(基类)已有的属性或方法。要分别创建两个类来实 现(两个独立的 .as 文件),例如:
package {
public class MyBaseClass {
public function sayHello():void {
trace("Hello from MyBaseClass");
}
}
}
package {
public class MySubClass extends MyBaseClass {
public function sayGoodbye():void {
trace("Goodbye from MySubClass");
}
}
}
不要忘记,每个类都必须在其自身的文件中,文件名为该类的类名,扩展名 .as,所以必须要有 MyBaseClass.as 文件和 MySubClass.as 文件。因此,在使用 Flash CS3 IDE 时,保存的 FLA 文件,要与这两个类在同一个文件夹。
下面代码会生产两个实例,把它写入时间轴看看会发生什么:
var base:MyBaseClass = new MyBaseClass();
base.sayHello();
var sub:MySubClass = new MySubClass();
sub.sayHello();
sub.sayGoodbye();
第一个实例没什么可说的,值得注意的是第二个实例中的 sayHello 方法,虽然在 MySubClass 中没有定义 sayHello,但它却是继承自 MyBaseClass 类的。另一个值得注意 的是,增加了一个新的方法 sayGoodbye,这是父类所没有的。
下面说说,在子类中如何改变一个父类中已存在的方法。在 AS 2 中,我们可以只需要重新 定义这个方法就可以了。而在 AS 3 中,则必需明确地写出 override 关键字,来进行重新定义。
package {
public class MySubClass extends MyBaseClass {
override public function sayHello():void {
trace("Hola from MySubClass");
}
public function sayGoodbye():void {
trace("Goodbye from MySubClass");
}
}
}
请注意,原来的 sayHello 方法被重写,再调用 MySubClass 后,就有了新的信息。另外,私有成员也不能被重写,因为它们只能被它们自身的类访问。
MovieClip/Sprite 子类
我们可以自己写一个类,然后让另一个类去继承它。在 AS 3 中,所有代码都不是写在 时间轴上的,那么它们一开始都要继承自 MovieClip 或 Sprite。 MovieClip 类是影片剪辑对象属性和方法的 ActionScript 模板。它包括我们所熟悉的属性如:影片的 x,y 坐标, 缩放等,这些在 AS 3 中的变化不大。
AS 3 还增加了 Sprite 类,通常把它理解为不在时间轴上的影片剪辑。很多情况下, 只使用代码操作对象,并不涉及时间轴和帧,这时就应该使用 Sprite 这个轻型的类。如果一个类继承自 MovieClip 或 Sprite ,那么它会自动拥有该类所有的属性和方法,我们还可以为这个类增加特殊的属性和方法。
注意,首先要导入 flash.display 包中的 Sprite 类,如果要导入 MovieClip 类,同 样也需要导入这个相同的包 flash.display.MovieClip 类。
创建文档类(Document class)
现在我们对类已经了一定的了解,接下来,看看如果真正地使用它。有时候我常说基于 AS 3 的 SWF 是多么的重要,这是因为 AS 3 引入了一个全新的概念,文档类(document class)。
一个文档类就是一个继承自 Sprite 或 MovieClip 的类,并作为 SWF 的主类。读取 SWF 时,这个文档类的构造函数会被自动调用。它就成为了我们程序的入口,任何想要做的事都可以写在上面,如:创建影片剪辑,画图,读取资源等等。如果在 Flash CS3 IDE 中 写代码,可使用文档类,也可以选择继续在时间轴上写代码。但如果使用 Flex Builder 2 或 免费 Flex SDK,那里没有时间轴,唯一的办法就是写在类中。这些工作一切都围绕着强大的文档类而展开,没有它就没有 SWF。以下是一个文档类的框架:
package {
import flash.display.Sprite;
public class Test extends Sprite {
public function Test() {
init();
}
private function init():void {
// 写代码处
}
}
}
如果你看过前面的部分,不会认为这是个新知识,只不过是把他们放在了一起而已。使用默认包,导入并继承 Sprite 类。构造函数只有一句,调用 init 方法。当然,也可以把所有代码写在构造函数里,但是要养成一个好习惯,就是尽量减少构造函数中的代码,所以 把代码写到了另一个方法中。本书会给大家很多代码块进行测试,那时要像上面这个例子一样把代码块放入 init 方法中,这样在影片编译执行时,就会调用 init 中的代码。下面我们要开始学习如何连接文档类和 SWF。
影片事件
影片事件在 AS 3 中彻底的消失了,这真是件好事。但还要捎带提一下,回顾 Flash 5 的时代,只有帧循环和影片剪辑事件两种选择。影片事件指代码直接写在影片剪辑上,而不是帧上。如何实现影片事件,首先选择舞台上的影片剪辑,然后打开动作面板并将代码写在上面,这些代码只对该影片剪辑有效。所有代码必需写在事件块中,比如:
onClipEvent(eventName){
// code goes here
}
对于 onClipEvent(eventName),作用于 eventName(某种事件)。对于"on"类型事件则 必需指定鼠标或键盘事件,如按下(press)和释放(release)。
事件名称(eventName)是指许多Flash 影片事件之一,所谓事件就是在影片中发生的事。事件分为两种:系统事件和用户事件。系统事件指发生在如计算机,Flash,或影片上的事件,比如调取数据,调取信息,或播放帧等。用户事件是指用户所做的一些事,基本上就是鼠标和键盘两种。影片事件使用得最多的就是 load 和 enterFrame 这两个。 Load 事 件会在影片第一次出现在舞台上时才执行,且只执行一次。所以说非常适合在这里面写入初 始化代码。只要把代码写在大括号间即可:
onClipEvent(load){
// initialization code
}
我们可以把带有如下代码的影片剪辑放入时间轴上(注意:此处为 AS 1 写法):
onClipEvent (load) {
this._x = 100;
this._y = 100;
}
onClipEvent (enterFrame) {
this._x += 5;
}
本示例中的代码不使用这种写法(因为它已经不是一种语言了),但不论使用何种方法,初始化(initialization),重复动作(repeating actions)和屏幕刷新(screen refresh) 都是非常重要的。
代码的书写
编写代码可以有两种方法:
一种是直接写在关键针上,另一种是调用外部类文件(简称abc文件)
方法一:关键针写入
在关键针上 打开动作面板,直接输入trace(“你好”); 就可直接输出小括号内容
方法二:调用外部类文件
1.首先在桌面新建一个文件交,存放红文件和类文件,
2.建一个红文件,存入文件夹中
3.新建一个角本文件,其中只能写角本
首选要打一个包:
package
{
import flash.display.MovieClip; //导入类
public class nihao extends MovieClip
// 继承类; nihao 继承了MovieClip 的方法和属性{
{
public function nihao() // 写构造器函数,构造函数必须与类的名称相同,
{
trace("你好");
}
}
}
4. 把该角本保存到刚才建好的存有红文件的文件夹中,要求类文件的名称要与自已定义的类名完全相同 ,否则景变成了方法,最后形成后缀名为.as的类文件
5.红文件与类文件的关联
打开红文件,在其属性面板中,选择文档类,输入保存好的类文件的名称,双击后面标志,就打开类文件编辑届面,保存后就可运行了!
按钮的使用
这节课,我们来学习以下内容:
1 在as3中是如何通过按钮来控制影片的播放
2 通过按钮来打开网页
首先在时间轴上创建一个简单的动画 其次创建两个按钮 再次在时间轴上编写代码 最后测试代码:
//后面跟的就是注释内容,测试时不进行编译
stop(); //先让动画停下来
function startMovie(event:MouseEvent):void //创建一个响应鼠标事件的函数,这是标准格式
{
this.play(); //函数运行时,播放动画,这里的this指的是当前的时间轴
}
playButton.addEventListener(MouseEvent.CLICK,startMovie);
//给playButton按钮添加一个监听事件
//MouseEvent.CLICK当按钮被单击的时候,调用starMovie函数
function gotoAuthorPage(event:MouseEvent):void
//创建一个响应鼠标事件的函数
{
var targetURL:URLRequest=new URLRequest("http://www.baidu.com");
navigateToURL(targetURL);
//该代码定义一个名为 gotoAuthorPage() 的函数。该函数首先创建一个代表 URL的 URLRequest 实例,然后将该 URL 传递给 navigateToURL()
//函数,使用户浏览器打开该 URL。
}
homeButton.addEventListener(MouseEvent.CLICK,gotoAuthorPage);
//给homeButton按钮添加一个监听事件
//MouseEvent.CLICK当按钮被单击的时候,调用gotoAuthorPage函数
btn.addEventListener(MouseEvent.CLICK, btnOnclick);
function btnOnclick(evt:MouseEvent):void {
gotoAndPlay(1,"场景1");
}
stop();
function gotoAdobeSite(event:MouseEvent):void
{ var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/");
navigateToURL(adobeURL);
} linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);