Document Class,中文直译为“文档类”。顾名思义,就是和文档绑在一起的类。
文档是啥?就是要和这个类绑在一起的Fla文件。
什么用处?
这个玩意儿根本目的就是想把AS代码和Flash设计完全剥离。
从此,Fla里面只管设计,逻辑代码全部由外部的类来包办。
对于设计者和新手,黑羽可以打个比方,就好比三步走:
1.把Fla里面所有代码集中到第一帧,
2.再把第一帧里的代码拷贝到外部的一个as文件里。
3.再按照AS3.0的形式,把这些代码放到这个类的构造函数里去。再根据这些个代码抽出一些类的属性和方法就OK了。
唔,这个比喻有很多小毛病。但比较直观,比较好理解,一步步来。
等你明白有哪些小毛病了,你已经不需要这个破比喻了。
对于程序开发者(比如c#)
Document Class就好比一个Entry,它的构造函数就相当于一个main函数。
教程相关例子下载:点击下载
先来一个例子:
上次建立的KingdaMC.fla和KingdaMC.as还在吧?
删了?
重来一遍吧,本次要用到fla里面的加好链接类的元件,以及相关的KingdaMC类文件。
我们干两件事:
1.新建一个Document Class类。
2.用上之前的那个Kingda.fla,绑定Document Class
1.新建一个as文件,命名为KingdaMCDocumentClass,记得要和fla在同一目录下:
输入如下代码:
//因为在统一目录下,所以package后面没有路径
package {
import flash.display.MovieClip;
public class KingdaMCDocumentClass extends MovieClip {
private var tempMC:KingdaMC; //临时变量,持有当时创建的KingdaMC的引用。
private var MAX_MCS:int = 10; //最多创建的KingdaMC数目
//构造函数,和类同名,在AS3.0中必须为public。不能用private,protected或者自定义的namespace
public function KingdaMCDocumentClass() {
var i:int; //新的数据类型int,只要是整数,就请用int。效率快过Number。
for (i = 0; i < MAX_MCS; i++) {
tempMC = new KingdaMC ();
//以下两行定义创建的KingdaMC形状大小随机
tempMC.scaleX = Math.random();
tempMC.scaleY = tempMC.scaleX;
//以下两行定义创建的KingdaMC位置在舞台上随机。
tempMC.x = Math.round(Math.random() * (this.stage.stageWidth - tempMC.width));
tempMC.y = Math.round(Math.random() * (this.stage.stageHeight - tempMC.height));
addChild(tempMC);
}
}
}
}
它要干的事很简单,就是用我们之前的KingdaMC类在舞台上创建十个KingdaMC实例,大小随机,位置随机。
2.用上之前的Kingda.fla,绑定KingdaMCDocumentClass。
确保库中已有设好KingdaMC类链接的symbol。
先把第一帧代码全部删掉。Ctrl+Enter测试一把。是不是有十个MC出来啊。
然后再像图中那样加上第一帧代码,和舞台元件乐一乐。就是不按照Document Class规矩干干,呵呵。
那么它到底是什么?
简单的说,是一个用来取代原有散乱的时间轴代码的标准解决办法。
当一个Fla文件被编译时,Document Class就被主动建立了。我们可以理解为Flash IDE偷偷加上了如下代码:
//path表示Document Class的包,如上一节中说过的org.kingda;
//DocClass是指Document Class的名字
import path.DocClass;
var TouTouDe:DocClass = new DocClass();
//实例名TouTouDe是我乱写的,哈哈。可能是默认的instance1之类的名字
这样的好处是所有的时间轴逻辑都剥离到Document Class类文件中,一旦成为一个独立的类文件,那么很方便的可以和CVS软件结合起来。对团队合作(Designer + Coder)来说是一大利好。对新手和小项目来说,没什么优点和必要。
下面说点高级讯息和运用:
有什么坏处?
坏处大大的有。那是相当的不习惯。
所有的舞台上的元件都别直接用属性来命名(比如说随便命名为BigKingda),不然就会出现以下出错讯息:
ReferenceError: Error #1056: 无法为 KingdaMCDocumentClass 创建属性 BigKingda。
当然这个限制只在与舞台上的元件,在元件类部直接命名子元件没有问题,在Timeline写相关的代码没问题。
重要:Document Class初始化顺序怎样?
黑羽个人的研究结果:一旦设置了Document Class,那么初始化顺序如下:
Document Class初始化 > 主时间轴代码执行 > 舞台元件绑定的类初始化 > 元件的时间轴代码初始化 >..
下面的层次按这样的规律循环。
Ok了,三大特色到此详细介绍完了。
尽量讲的浅俗易懂,大家明白就好。而且黑羽也加上了一些高级讯息供老鸟参考。喜欢的顶一把!^_^
下次开始AS3.0的本质之旅:
AS 3.0的新数据类型及本质
P.S:本教程受Creative Commons License.协议保护,未经作者同意,不得用于商业用途。







Comments (16)
先顶一个.黑羽继续写
Posted by clingingboy | July 4, 2006 12:36 AM
Posted on July 4, 2006 00:36
继续加油写教程好,最好来个实例游戏,比如俄罗斯方块^_^
Posted by zjwps | July 4, 2006 1:37 AM
Posted on July 4, 2006 01:37
黑羽,
我看了你的CSS,你到 .module-header 那里加上一句:
margin-bottom: 0;
应该好了.
Posted by Yang | July 5, 2006 10:29 PM
Posted on July 5, 2006 22:29
啥时候出新的教程啊???
Posted by leo | July 6, 2006 5:13 PM
Posted on July 6, 2006 17:13
支持~
Posted by minlab | July 7, 2006 11:33 AM
Posted on July 7, 2006 11:33
你写的教程真是少有的通俗易懂,你出本关于as 3.0的书,我必买!!
Posted by ourme | July 13, 2006 6:26 PM
Posted on July 13, 2006 18:26
to ourme:
thx ^_^
Posted by 黑羽 | July 13, 2006 8:03 PM
Posted on July 13, 2006 20:03
var i:int; //新的数据类型int,只要是整数,就请用int。效率快过Number。
int的效率好像不一定高,看看这篇文章:
http://kuwamoto.org/2006/06/15/avoid-ints-in-actionscript/
Posted by ayong811 | July 22, 2006 12:35 AM
Posted on July 22, 2006 00:35
黑羽,想问一下,如果舞台上的mc不能用属性来命名,来怎么在类里调用它呢,多谢。
Posted by Billows | August 17, 2006 11:53 AM
Posted on August 17, 2006 11:53
谢谢!!!:)
Posted by haihai,加油! | January 10, 2007 12:34 PM
Posted on January 10, 2007 12:34
是不是一定要把一个symbol先拖进舞台,然后才能建出其他实例啊??
Posted by Felix | February 16, 2007 2:00 PM
Posted on February 16, 2007 14:00
我晕,什么叫"所有的舞台上的元件都别直接用属性来命名"
我现在就出现这样子问题了,可是你的文字好难理解啊
Posted by showping | April 24, 2007 8:04 PM
Posted on April 24, 2007 20:04
现在在stage上的MovieClip都不能命名,好郁闷,知道怎么解决么?
Posted by showping | April 24, 2007 8:12 PM
Posted on April 24, 2007 20:12
謝謝~
非常有用
Posted by Cinny | August 10, 2007 1:09 PM
Posted on August 10, 2007 13:09
黑羽大哥 小弟有个问题
2.0在加载的时候都有个深度管理 那3.0已经不需要了吗 还有 for (i = 0; i tempMC = new KingdaMC ();
tempMC为什么不会冲突呢
Posted by laiensi | September 10, 2007 10:03 AM
Posted on September 10, 2007 10:03
很有用啊 太谢谢您了~
不知道这样的方法对不对 但是可以使在舞台上的mc直接命名,办法就是在import flash.display.Sprite;后再导入import flash.display.MovieClip;
Posted by 小阳 | October 7, 2007 12:56 AM
Posted on October 7, 2007 00:56