1、类的一般结构packagepublic class MyClass类成员;public function MyClass() /构造函数package 表示包的意思,表示类文件保存的位置,文件名与类名相同。建立为一个类后,我们就可以像 flash 提供的其它类一样,可在 AS3.0 代码中使用。如下var my:MyClass=new MyClass();类的成员有成员常量、成员变量、成员函数三种:如下的一个类packagepublic class MyClasspublic const pi:Number=3.1415926;public var r:Number;private var s
2、:Number;public function MyClass()其中 pi 为成员常量、r,s 为成员变量、MyClass 为成员函数。public,private 是属性关键字,表示成员的可见性。public:表示指定类、常量、变量、方法可用于任何调用者。private:表示常量、变量、方法仅供声明它或定义它的类使用。protected:表示常量、变量、方法或命名空间只用于定义它的类及该类的任何子类。internal:表示类、常量、变量、方法可用于同一包中的任何调用者。请看下段代码var m:MyClass=new MyClass();m.r=3; /正确m.s=8; /错误要在外部改变
3、s 或访问 s 要如何呢?我们来修改一下 MyClass 如下packagepublic class MyClasspublic const pi:Number=3.1415926;public var r:Number;private var s:Number;public function MyClass()public function setSValue(value:Number):voids=value;这样就有一个公共公共方法设置 s 的值,可以使用如下语句设置 s 的值。m.setSValue(18);与其它语言一样,我们可以使用 get 和 set 方法来读取与写入 priva
4、te 变量的值。packagepublic class MyClasspublic const pi:Number=3.1415926;public var r:Number;private var s:Number;public function MyClass()trace(这是 MyClass 的构造函数);public function set sValue(value:Number):voids=value;public function get sValue():Numberreturn s;我们在调用时可以使用如下语句m.sValue=18; /当使用 set 方法后可以使用va
5、r a:Number=m.sValue; /当使用 get 方法后可以使用。类的继承继承是指一种代码重用的形式,允许程序员基于现有类开发新类。现有类通常称为“基类”或“超类” ,新类通常称为“子类” 。先看一段代码packagepublc class MySubClass extends MyClasspublic function MySubClass()trace(这是 MySubClass 构造函数);trace(“pi:”,pi); /正确trace(“r:”,r); /正确trace(s:,s); /错误可以看到 pi,r,s 是在 MyClass 这个类中定义的常量、变量,那么由于
6、 MySubClass 继承了MyClass,所以 MySubClass 也能使用这些量,但代码前两个是正确,后一个是错误,这是什么意思呢,回忆下上一节学到的“属性关键字” 。public 和 protected 在子类中是可以使用的,private 是不行,所以这里 pi 和 r 可以使用的,s 不能用,并且子类在构造的时候也会执行基类的构造方法。观察如下语句(将错误语句删除 )var mySub:MySubClass=new MySubClass(); 输出为这是 MyClass 构造函数这是 MySubClass 的构造函数pi:3.1415926r:NaN上节的继承是继承我们自己定义的
7、类,如果要用到影片和类关联起来,我们可能会更多的去继承 AS3.0 中已有的类Sprite 的 MovieClip;packageimport flash.display.Sprite;public class MySprite extends Spritepublic function MySprite()graphics.beginFill(0xFFCC00);graphics.drawCircle(40,40,40);现在我们建立一个 MySprite 的类,因为它是继承的 Sprite 类,所以我们可以使用 graphics来画图,这里我们画一个圆。要使用这个类,我们同样要在帧上加一些
8、代码:var mySprite:MySprite=new MySprite();addChild(mySprite);mySprite.x=100;mySprite.y=100;文档类:在 FlashCs3.0 中加入了一个文档类(document class)的概念,使用文档类后,我们刚才写帧上面的代码就不用了,直接写在文档类里面,文档类就相当于第一帧的位置,这样我们就不用在 Fla 文件里写代码了,所有代码都写在 AS 文件里达到了界面与代码的分离。写一个文档类packageimport flash.display.Sprite;public class MainForm extends
9、Spritepublic function MainForm()var mySprite:MySprite=new MySprite();addChild(mySprite);mySprite.x=100;mySprite.y=100;新建一个 fla 文档 (ActionSprite3.0),保存的同一个目录下,设置文档属性中的文档类为MainForm。加载库中的 MC上一节中,我们将库中的 MC 键接到一个类上,达到了类与元件的绑件,那么要完成像2.0 一样的效果,将库中的元件载入到场景中是不是也要在 MC 上链接类了(3.0 中没有以前的标识符) ,如果每个在库中的 MC 都要链接一个类
10、就麻烦了,其它只需要在类后面起个名字就可以了。比如我们起个名字叫 MyMc 基类就用默认的 flash.display.MovieClip(注意在点确定时有个找不到类我警告,不用管它,点确定就可以了),在文档类中这样写:packageimport flash.display.Sprite;public class MainForm1 extends Spritepublic function MainForm1()var mymc:MyMc=new MyMc();addChild(mymc);var mysound:MySound=new MySound();mysound.play();同样
11、,要播放库中的声音也可以这样做,链接的类后面取一个名字 MySound,基类MySound,基类就用默认的 flash.media.Sound反射的方式加载库里的 MC在上一节中我们用到了在库中加载一个元件,我们还有另一个方法来加载一个元件,就是用“反射”的方法,反射就是用库中元件的名字(字符串)去得到我们想要的元件,用代码去把它变成一个类。我们在库中建立两个 MC,并用上一节的方法将它们导出,名字分别为 Mc1 和 Mc2,我们要将这两元件加载到场景上,按照上一节的方法,我们应该这样做:packageimport flash.display.Sprite;public class MainF
12、orm2 extends Spritepublic function MainForm1()var mc1:MovieClip=new Mc1();addChild(mc1);var mc2:MovieClip=new Mc2();addChild(mc2);那么如果用反射的方法应该怎样做呢,看下面的代码packageimport flash.display.Sprite;import flash.display.MovieClip;import flash.utils.getDefinitionByName;public class MainForm3 extends Spritepubli
13、c function MainForm3()var ClassReference:Class=getDefinitionByName(“Mc1“) as Class;var instance:MovieClip=new ClassReference();addChild(instance);这段代码只加载了 Mc1 这个元件,而且我们发现代码比上一种方法更复杂一些,那为什么要使用反射这种方法呢,我们在看一段代码:packageimport flash.display.Sprite;import flash.display.MovieClip;import flash.utils.getDefi
14、nitionByName;public class MainForm4 extends Spritepublic function MainForm4()for (var i:int=1;i9?(nowDate.getHours().toString():0+nowDate.getHours().toString();_model.minutes=nowDate.getMinutes()9?(nowDate.getMinutes().toString():0+nowDate.getMinutes().toString();_model.second=nowDate.getSeconds()9?
15、(nowDate.getSeconds().toString():0+nowDate.getSeconds().toString();这个类中我们用到了 Timer 类因为我们用的是时钟,所以需要一个定时器,Timer 是一个很好的定时器,Timer(1000,0),这里 1000 是指 1000 毫秒,就是 1 秒钟触发一次定时器,0 表示次数,这里 0 是无限次,如果是大于 0 的数就是这个数的次数。侦听TimerEvent.TIMER 事件就是 1 秒钟去执行一次 timerHandler 方法,timerHandler 方法的功能得到当前的时间然后去改变_model 里面的值,再看一下
16、 ModelLocator.as 里面的代码,hour,minutes,second 的值改变的时候就会去发消息出去,那么谁来侦听这些消息呢,当然是 View,现在来看下 View.aspackageimport flash.display.Sprite;import flash.events.Event;import flash.text.TextField;public class View extends Spriteprivate var _model:ModelLocator;private var _controller:Controller;private var time_tx
17、t:TextField;public function View(model:ModelLocator,controller:Controller):void_model=model;_controller=controller;time_txt=new TextField();addChild(time_txt);_model.addEventListener(“changeHour“,changeTimeHandler);_model.addEventListener(“changeMinutes“,changeTimeHandler);_model.addEventListener(“c
18、hangeSecond“,changeTimeHandler);_controller.startTime();private function changeTimeHandler(event:Event):voidtime_txt.text=_model.hour+:+_model.minutes+:+_model.second;在 View 里面,侦听了_model 的事件,所以当收到数据改变的消息后,将_model 的数据显示到文本框架中。要使程序,我们现加一个文档类:packageimport flash.display.Sprite;public class Clock extend
19、s Spriteprivate var _model:ModelLocator;private var _controller:Controller;private var _view:View;public function Clock():void_model=new ModelLocator();_controller=new Controller(_model);_view=new View(_model,_controller);addChild(_view);在文档中建立了 ModelLocator、Controller、View 的实例,ModelLocator 产生的实例被传到
20、了 Controller 和 View 中,这样就保证了 Controller 和 View 使用的是相同的 ModelLocator,其实要达到这种效果不用这种方法也可以,可以用到上一节中用到的单例模式。这里作一个总结,Controller 是一个控制者,它去改变 ModelLocator,ModelLocator 的数据被改变后更新 View,使我们能看到数据。如果界面上有一些按钮交互,那么就应该ModelLocator,ModelLocator 数据改变后通知 View 去改变界面。有人可以会说这个程序用更少的代码就可以完成,但这里只是演示程序的架构,当程序很大时,好的架构会使程序更清晰
21、。Loader 加载类今天我们来看一下我们在实际应用经常要用到的关于加载方面的类:Loader 类:Loader 类可用于加载 SWF 文件或图像(JPG、PNG 或 GIF)文件。这是我们经常要用到的一些操作,比如我们做个图片浏览器,那么就需要加载一些 JPG 之类的图像文件(如果说我们把这个图像文件导入到库中,那会使文件变得很大,最重要的是会失去程序的灵活性,那些图片是死的,要改的话要去导入图片到库) ;我们也会做一个SWF 作为框架,然后把各个独立的功能做成单独的 SWF 通过那个加载进去,比如说做游戏,我们做一个游戏大厅(这个就是框架) ,然后各个游戏通过大厅来加载,这样我们也可以用这个类来加载 SWF。我们先来看看加载 SWF 文件,先看一段代码: