hi,鸟笼山的朋友们,这次我们开始介绍AS3.0中的类如何和库中元件绑定,和特殊的Document Class设计。
总共4步:
1.建一个标准的AS3.0类 (暂命名为KingdaMC,多么伟大的名字啊,简称“有名”)
2.新建一个元件,并设置它的Linkage和上面的类绑定。
3.在时间轴上写代码,用AS3.0代码创建n份“有名”。
4.删掉时间轴上代码,使用Flash 9新特色Document Class在舞台上创造n份“有名”。just 体验一把。
(写起来才知道要讲的内容多啊,晕,打了两个小时,累了,本节专门只讲讲AS3.0的类吧,其余的慢慢再讲)
在创建AS3.0之前,请允许我先对AS3.0类的语法和继承设计表示敬意。与标准的完全兼容,更好更严格的封装特性,特别是命名空间(name space)的引入。从今天起从AS3.0起, 在OOP层面上,AS3.0已经和Java,C#平起平坐了,甚至在某些方面(比如name space)比java更有意思。
让俺对AS2.0老鸟说几句憋在心里的激动之语:![]()
如果说AS2.0只是外表接近OOP标准语言,内在还是乱糟糟的AS1.0脚本语言,那么AS3.0不论是从OOP设计级别,还是从编译器级别(如,对弱引用—— week reference—— 的支持)来评估的都是标准、正宗、强大的语言。
从AS3.0起,我们ActionScript 开发者可以挺起胸口,俺们是真正的行业标准级程序员。
在我继续教程之前,我要唱首歌给大家听:
AS3的英明,绝对不是一句两句能说清!~~~~~~![]()
打完,收工。
1.建立AS3.0类文件,
类文件是干嘛用的?比如说,我们想让一个对象(Object)有很多功能,比如说这个对象是MovieClip型的,支持拖拽,支持双击等等。那么先在一个类文件里写清楚这些要求和实现方法,然后就可以用这个类创建许多实例,这些实例就全具有了这些功能。写一次,就能用很多次,多好。最重要的是它还可以通过继承来重用很多代码,为将来节省更多的时间。
废话少说,Ctrl+N打开“新建”窗口,选择建立“ActionScript file”,Ctrl+S,暂存为"KingdaMC.as"文件。(即“有名”的类文件)。
输入如下代码:
讲解1: AS2.0中我们使用的是全饰名称来声明类,通俗说,包括了类的路径在类名前。AS3.0则把路径提取出放在package这个关键字后面。 本文例子中的类文件和Fla文件在同一个目录下,因此 package后面没有什么东西。如果类文件在 org目录下的kingda目录里,那么就要写成
//【黑羽】ActionScript 3.0系列教程(2)
// http://www.kingda.org
//代码如下//package 见讲解1
package {
import flash.display.MovieClip; //讲解2
import flash.events.MouseEvent;//讲解3
public class KingdaMC extends MovieClip {
public function KingdaMC() {
trace("Kingda created: " + this.name);
this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK, clickHandler);
this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener);
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpListener);
}
private function clickHandler(event:MouseEvent):void {
trace("You clicked the ball");
}
function mouseDownListener(event:MouseEvent):void {
this.startDrag();
}
function mouseUpListener(event:MouseEvent):void {
this.stopDrag();
}
}
}
// ActionScript 2.0
class org.kingda.KingdaMC {
}
// ActionScript 3.0
package org.kingda {
public class KingdaMC {}
}
你在package中可以定义好几个类,不用再写全饰名称了。但我不推荐这样做。一个文件一个类比较好管理。
讲解2:
MovieClip类再也不像AS2.0那样是默认的全局类了。你要使用MovieClip类一定要写这一句导入。
讲解3:
类在AS3.0中也有public 和 internal的区分了。
public 表示这个类可以在任何地方导入使用。
internal表示这个类只能在同一个package里面使用。
不写,就默认为internal这个新的关键字。
还有一个属性是final,表示这个类不能被继承了,继承树到此为止。
说白了,这三个属性都是用来让我们更加规范的管理类之间的关系,以便将来修改时心里有谱,大大的方便了修改。
同时,对架构的设计能力要求更高,新手们和小项目还是多使用public吧。越到后来你会越喜欢internal的。我只要看到internal和private这两个关键字,心中就无比的稳定和舒服。想来不少programmer和我都会有同感吧。
2.新建一个元件,并设置它的Linkage和上面的类绑定。
和教程第一章一样,画一个方块,按F8转成MovieClip,再在库中右键点击它,选择"linkage"
在Class里面写上KingdaMC。注意,id输入框已经被废止了。因为在AS3.0中,再也没有MovieClip.attachMovie(), MovieClip.createEmptyMovieClip(), 以及 MovieClip.createTextField()的存在了。
所有舞台的可见对象都由new来创建。
比如说本例中,symbol1绑定了KingdaMC,那么如果我要在舞台上创建一个KingdaMC,只要写
var b1:KingdaMC = new KingdaMC();
addChild(b1);
即可。
还记得以前那些乱七八糟的创建影片和组件的语法吗?什么createClassObject(),DepthManager的createChildAtDepth(),createClassChildAtDepth(),等等等等。我的一个java同事刚刚学习AS时,被上面哪些乱乱的创建函数弄得一头雾水。统统没有了。只有一统天下的new ClassName(),多标准哪,多舒服啊,多好学啊。
所以说,没学AS2.0直接学AS3.0绝对是新手的福气。
第二句,addChild这个很重要。
光有第一句new可不行。那只是告诉Flash我建了一个名字叫b1的KingdaMC要显示,但还没告诉Flash什么时候显示呢。
你什么时候打addChild(b1),那Flash才会把它显示在舞台上。怎么样,多简单。
其实这里省略了一个this。如果你有一个MovieClip名叫BigKingda,希望在这个BigKingda里面加上一个KingdaMC实例,那么就要写
BigKingda.addChild(b1);
非常简单。
Ctrl+Enter测试,发现创建的KingdaMC,支持拖拽。
大家试着用代码多创建几个KingdaMC,比如用for循环来建个10个8个的来玩玩。
好了,累了,要歇歇了,下次讲Document Class。
本节代码例子参考了Jen deHaan的教程,原因很简单,她选的例子很好的说明了绑定和Document Class,黑羽做了少量的中文改动。她原来的源码例子点此下载。







Comments (26)
Good!
发现一份讲解用Flex 2里的mxmlc.exe编译as3文件的教程(同样可以编译mxml文件),比较适合新手。
http://www.senocular.com/flash/tutorials/as3withmxmlc/
所以现在写as3程序,有两种选择
(Flex 2 SDK, Flash 9).
Posted by haxe | June 29, 2006 11:42 PM
Posted on June 29, 2006 23:42
mouseDownListener
mouseUpListener
这两个方法没有加访问修饰符 :)
Posted by 棉花糖 | June 30, 2006 12:04 AM
Posted on June 30, 2006 00:04
不加,默认就是internal,只对package内部可见
^_^
Posted by 黑羽 | June 30, 2006 12:12 AM
Posted on June 30, 2006 00:12
为什么要区别出 clickHandler 方法的 private 呢?
Posted by 棉花糖 | June 30, 2006 12:26 AM
Posted on June 30, 2006 00:26
hi .. 郁闷,我这里无法下载。你能不能传给我一个?
msn:aw - awflasher.com
qq : 202 66 077
Posted by awflasher | June 30, 2006 1:59 AM
Posted on June 30, 2006 01:59
to haxe
Great!我去看看。
现在还有个Flasc,直接把mtasc集成到Flash IDE里面去了,很方便。^^
Posted by 黑羽 | June 30, 2006 8:21 AM
Posted on June 30, 2006 08:21
to aw:
发到 aw@awflasher.com去了,check check ^^
Posted by 黑羽 | June 30, 2006 8:25 AM
Posted on June 30, 2006 08:25
兄弟,加偶,有事找你
MSN:zjs35@163.com
Posted by zjs35 | June 30, 2006 9:00 AM
Posted on June 30, 2006 09:00
thks!
Posted by tdus | June 30, 2006 11:43 AM
Posted on June 30, 2006 11:43
1.写KingdaMC.as的时候,使用f9的autoformat功能会报错。为什么?**Error** E:\LEO-CHOU\MyWorks\实用fla\f9测试\KingdaMC.as: Line 6: Syntax error.
package {
**Error** E:\LEO-CHOU\MyWorks\实用fla\f9测试\KingdaMC.as: Line 11: Attribute used outside class.
public class KingdaMC extends MovieClip {
**Error** E:\LEO-CHOU\MyWorks\实用fla\f9测试\KingdaMC.as: Line 20: The class or interface 'flash.events.MouseEvent' could not be loaded.
private function clickHandler(event:MouseEvent):void {
**Error** E:\LEO-CHOU\MyWorks\实用fla\f9测试\KingdaMC.as: Line 23: The class or interface 'flash.events.MouseEvent' could not be loaded.
function mouseDownListener(event:MouseEvent):void {
**Error** E:\LEO-CHOU\MyWorks\实用fla\f9测试\KingdaMC.as: Line 26: The class or interface 'flash.events.MouseEvent' could not be loaded.
function mouseUpListener(event:MouseEvent):void {
**Error** E:\LEO-CHOU\MyWorks\实用fla\f9测试\KingdaMC.as: Line 30: ActionScript 2.0 class scripts may only define class or interface constructs.
}
Total ActionScript Errors: 6 Reported Errors: 6
2.引用这个as以后的fla也出现这样的警告。WARNING: ActionScript 3.0 does not support actions on button or MovieClip instances. All scripts on object instances will be ignored.
Kingda created: instance1。。。
我是新手,这些都不太了解。所以问下..谢谢
Posted by leo | July 3, 2006 11:10 AM
Posted on July 3, 2006 11:10
to leo:
已解答在AS3.0教程(外1)
http://www.kingda.org/archives/kingda/2006/07/as301flash_9_alpha.html
Posted by 黑羽 | July 4, 2006 12:14 AM
Posted on July 4, 2006 00:14
上面有一句有笔误:var b1:Kingda = new KingdaMC();
应该是:var b1:KingdaMC = new KingdaMC();
Posted by 莫名 | July 5, 2006 11:12 AM
Posted on July 5, 2006 11:12
莫名说的队,kingda快改过来吧.
Posted by Coder | July 5, 2006 2:04 PM
Posted on July 5, 2006 14:04
黑羽,我的QQ:395696517,有事联系你
Posted by 大朋 | July 16, 2006 10:06 AM
Posted on July 16, 2006 10:06
to 大朋
已经加你,你不在线上。
Posted by 黑羽 | July 16, 2006 9:58 PM
Posted on July 16, 2006 21:58
“你在package中可以定义好几个类,不用再写全饰名称了。但我不推荐这样做。一个文件一个类比较好管理。”
有时候在package定义多个类是非常好用的,比如
http://eidiot.net/wp-content/uploads/learn_as_3/button/TestBtn.swf
Posted by eidiot | July 20, 2006 10:45 AM
Posted on July 20, 2006 10:45
to 莫名和coder
哇,漏了,才发现。现在改过来了
thx ^^
Posted by 黑羽 | July 30, 2006 5:35 PM
Posted on July 30, 2006 17:35
to eidiot
呵呵,其实也就是方便一点而已。
我还是认为一个package只定义一个类好一点。
除非有个类我确认只有这个package里的类才用到,其他的不用到,我才有可能放到一个package中去。
^0^
Posted by 黑羽 | July 30, 2006 5:38 PM
Posted on July 30, 2006 17:38
黑羽老师的人品是不错的
黑羽老师的货色是一流的
但是黑羽老师的BLOG放上广告条
就忒难看了
Posted by Anonymous | November 23, 2006 7:59 PM
Posted on November 23, 2006 19:59
黑羽 大哥 的 教程实在太棒了~~赞一个!
小弟也是个 flash爱好者哈~
不嫌弃的话 加我的 QQ吧~~
以后有机会可以讨论讨论^_^^
谢谢了~
QQ:99595531
Posted by HUPEIKANG1 | February 19, 2007 11:44 PM
Posted on February 19, 2007 23:44
刚开始学习as就遇到了改革开放~
所以甩开2.0开始学3.0了。
但根基很弱请黒羽老师多多指教拉~
可以的话,请加我的msn:
warmmoonlight@hotmail.com
Posted by 温暖的月光 | May 23, 2007 4:11 PM
Posted on May 23, 2007 16:11
大家好,
我遇到了一个奇怪的问题:
按照黑羽前辈的方法做了之后,可以从库中拽元件(已和类捆绑)到舞台,功能完全没有问题。但当我用代码
var b1:KingdaMC = new KingdaMC()
创建实例的时候就会报错:
TypeError: Error #1009: 无法访问空对象引用的属性或方法。
请问大家这是为啥啊?
谢谢了!
Posted by 初学者甲 | June 1, 2007 2:52 PM
Posted on June 1, 2007 14:52
addChild(b1);不是创建以个b1了吗,但默认位置是在左上的,我这样写:
b1._x=200;
b1._y=200;
KingdaMC不是继承了MovieClip类的吗?为什么报错呢?
1119: 访问可能未定义的属性 _x (通过 static 类型 KingdaMC 引用)。
Posted by 烟灭之后 | August 7, 2007 8:48 AM
Posted on August 7, 2007 08:48
如果定义类的as文件在abc文件夹中那么as中写package abc{...}
fla中库里的元件链接相应改为abc.KingdaMC
请问fla中时间轴上的代码
var b1:KingdaMC = new KingdaMC();
应如何写?
Posted by Lancelot | August 22, 2007 4:54 PM
Posted on August 22, 2007 16:54
复制100个小球实现拖动、点击等动作。
aaa.fla绑定aaa.as主类,
主类里面用addChild不能显示
bbb.fla中用bbb.as绑定的库元件。
郁闷了···
Posted by 糨糊 | August 24, 2007 4:18 PM
Posted on August 24, 2007 16:18
能不能加我?QQ:28022229
MSN:charis.peng@hotmail.com
觉得还是做flash的有“钱”途!!!
Posted by 超超 | October 12, 2007 11:33 AM
Posted on October 12, 2007 11:33