分享
 
 
 

Flash Actionscript知识:从AS2到AS3

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

随着Flash CS3正式版的发布,估计很多朋友都开始从AS2迁移到AS3了。不过AS3比AS2改变的实在太多,在as2中很多方法属性在as3中并不相同,甚至消失,而且目前帮助文档是E文的,现下的as3基础文章也并不多,因此特别引出这个讨论,集合一些基础性的要点,尽量以例子来说明,让大家更快更好的往AS3迁移。文中如有错误,敬请指正。有兴趣的朋友也可以一起来讨论。

1、常量

先看AS2代码: var str:String;

var num:Number;

var boo:Boolean;

var obj:Object;

var notyped;

trace(str+newline+num+newline+boo+newline+obj+newline+notyped);

//return

undefined

undefined

undefined

undefined

undefined

再看AS3代码:

var str:String;

var num:Number;

var boo:Boolean;

var obj:Object;

var notyped;

trace(str+"\n"+num+"\n"+boo+"\n"+obj+"\n"+notyped);

//return

null

NaN

false

null

undefined

从上面2个例子可以清楚的看到:在as2中String、Number、Boolean、Object 的默认值都是undefined,而在as3中则分别为null、NaN、false、null。只有未作申明的变量的默认值才是undefined。因此,在as2中一个"undefined"打天下的时代已经过时了,在as3中更加明确。同时as2中还有一个常量newline 在as3中已经取消,由"\n"替换。另外特别说明就是trace 方法的功能也加强了,参数个数不限,因此上面可以改成trace(str,num,boo,obj,notyped)了。

2、操作符

这里只讨论instanceof。虽然as3中还保留了这个操作符,但as3中推荐用is代替它。而且is的用法更为灵活。

代码:

var mystr:String="test";

var mytest:Test = new Test();//Test is extends SuperTest

trace(mytest instanceof SuperTest); //AS2 return false //AS3 return true

trace(mystr instanceof String);//AS2 return false

trace(mystr instanceof String);//AS3 return true

trace(mystr is String);//AS3 return true

从此例可以看出instanceof 在as3中的比as2中有了变化。在as2中instanceof 不会将原始类型转换为包装对象,因此在上面例子中的 String 验证中返回false,并且它对超类(如SuperTest)不起作用。而在as3中它只检查原型链,所以在第一个trace 中会返回 true。但是as3中instanceof 并不支持接口,而is 支持。

代码:

var mytest:Test = new Test();//Test implements InterfaceTest

trace(mytest is InterfaceTest); //AS3 return true

trace(mytest instanceof InterfaceTest); //AS3 return false

至于add、eq、gt、ge、<>、and、not、or、ne、lt、le等AS1的语法在as3中统统取消了。

3、参数

在AS3中增加了一个... (rest)这样的参数。它的作用是指明函数可以接收任意多个以逗号分隔的参数。AS3代码:

function testfun1(param0, param1, ...arg)

{

trace(arg is Array,arg,arg.length);

}

testfun1("param0","param1","param2","param3");

//return: true param2,param3 2

在这里... arg表示一个名为arg的数组。

当运行testfun1后,arg=["param2","param3"]。还记得function有个arguments 类么,当使用了...(rest)后,argumnets 就无法获取了。但是如上例所示arg.length 同样可以使用。但是并没有类似arguments.callee 的这种方法,所以要使用...arg的时候确保不会使用arguments.callee 的方法。

访问控制以及命名空间

在AS2中我们已经知道有public, PRivate 这2个访问控制符,在AS3中增加了internal和protected,并且对类、方法的访问控制更加严格,也更加合理和方便。另外,AS3中还增加了命名空间namespace,这样我们的访问控制更是灵活无比。(public和private 相信大家已经熟悉了,故不赘述)如有错误,敬请指正。

internal 指明类、变量、常数、方法等在包package 级别可访问到。大家可能会问它和public与private的区别。public只能在package{}中才能使用,但public控制的类或方法可以在任何地方访问到;private只能在class{}中才能使用,它控制的类或方法仅能在相应的class中才能访问到。而internal可以在package{}外使用,但它只能作用于这个as文件内部。比如如下DDD.as中代码为:

package flashrek.example{

public class DDD {

function DDD() {

var e:EEE=new EEE();

}

}

}

internal var internalStr:String="internalStr";

class EEE {

function EEE() {

trace(internalStr);

}

}

那么如下代码运行结果为: import flashrek.example.DDD;

var d=new DDD();//输出:internalStr

trace(internalStr);//输出:错误Err

可以看出,类DDD可以访问到package外的类EEE(默认就是internal,因此可以省略),而类EEE也可以访问到变量internalStr。而DDD.as文件外的其他地方就无法访问到EEE和internalStr了。

和internal不同,protected只能应用于类class内。它指明变量、常数、方法等在类class级别可访问到。与private区别在于,protected指定的方法、变量等是可以继承的,在子类中能访问到他们。

AS3中还引入了命名空间namespace。当你有一些有特殊用途的方法分布在不同的包package里,你想要这些方法在所有package里都可以应用,但你又不想把这些方法设置为public。这个时候,namespace就能达到你的目的。

首先你要定义一个namespace,(flashrek.as):

package flashrek.example{

public namespace flashrek= sucai.knowsky.com;

}

然后在AAA.as文件中的代码为:

package flashrek.example{

import flashrek.example.flashrek;

public class AAA {

function AAA() {

var b:BBB=new BBB();

//flashrek::NStest();

}

flashrek function NStest() {

trace("namespace test");

}

}

}

//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。

//package外是不能使用public关键字的。

internal class BBB {

function BBB() {

trace("BBB");

var c:CCC=new CCC();

}

}

class CCC {

function CCC() {

trace("CCC");

}

}

接下来再看运行结果: import flashrek.example.AAA;

import flashrek.example.flashrek;

var a=new AAA();

a.flashrek::NStest();

//输出:

BBB

CCC

namespace test

由此我们可以看出,通过a.flashrek::NStest();这样的方法,我们可以访问到NStest方法,而其他地方是无法直接访问到这个方法的。

在上例中大家发现,namespace很像一个类。确实有点像:)但namespace可以在package外,class内进行定义,而且也可以用public、internal等来进行访问控制。

比如去掉上例中的flashrek.as,而把AAA.as改成如下:

package flashrek.example{

public class AAA {

function AAA() {

var b:BBB=new BBB();

flashrek::NStest();

}

flashrek function NStest() {

trace("namespace test");

}

}

}

//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。

//package外是不能使用public关键字的。

namespace flashrek= "www.flashrek.com"

internal class BBB {

function BBB() {

trace("BBB");

var c:CCC=new CCC();

}

}

class CCC {

function CCC() {

trace("CCC");

}

}

在这里namespace flashrek 定义在package 外,它只能在package 级别访问到。因此用a.flashrek::NStest();是错误的。

全新的加载(Loading)机制

做一个loading预加载的效果相信大家都已经非常熟悉了,不管是用onEnterFrame还是setInterval,还是更高级的 MovieClipLoader。可当开始用AS3的时候,便连一个最简单的loading都无从下手了。是不是AS3中的loader更加复杂,难以控制呢。其实不是的,在AS3中引入了一个全新的类LoaderInfo,这个类可作用于任何的可显示对象(display object),这个对象里包含了加载过程检测、加载地址、加载对象的内容、加载对象总字节数(和加载过程中的字节数)、加载对象的宽度高度等等非常多的内容(内容太多了,更多的大家可以去看帮助)。

有2种方式可以访问LoaderInfo对象:

1)访问flash.display.Loader对象的contentLoaderInfo属性;

2)任何一个可显示对象(display object)都有loaderInfo属性;

注意:每个SWF文档的主类的实例有loaderInfo属性,每个Loader有loaderInfo属性,同时它有一个contentLoaderInfo属性,通过这个属性你可以访问到Loaded对象的loaderInfo。具体可以看下图:

下面还是老习惯,来例子示范。首先来一个loading外部文件的例子:

var request:URLRequest = new URLRequest("flashrek.swf");

var loader:Loader = new Loader();

loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

function loadProgress(event:ProgressEvent):void {

var percentLoaded:Number = event.bytesLoaded/event.bytesTotal;

percentLoaded = Math.round(percentLoaded * 100);

trace("Loading: "+percentLoaded+"%");

}

function loadComplete(event:Event):void {

trace("Complete");

}

loader.load(request);

addChild(loader);

这里要注意loader的load方法只接受URLRequest对象作为参数;另外就是ProgressEvent类,比较简单,看帮助就好了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有