达达首页 | 设计教程 | 辅助工具 | 字体字库 | 素材贴图 | 非 主 流 | PS 笔刷 | 签名模版 | 网页模版 | 达达贴吧
设为首页

加入收藏

联系我们
PhotoShop 教程 | Illustrator 教程 | CorelDraw 教程 | FireWorks 教程 | 3D MAX 教程 | MAYA 教程 | Flash 教程 | After Effects 教程
相关教程
普通教程 Flash声音控制教程
普通教程 利用FLASH脚本语言制…
普通教程 Flash电子书鼠标拖拽…
普通教程 纯脚本的鼠标跟随效…
普通教程 利用遮罩实现的红旗…
普通教程 Adobe flash cs3 Ac…
普通教程 FLASH的动态文本如何…
普通教程 Flash ActionScript…
普通教程 FLASH 实现动态模糊…
普通教程 最常用的Flash语句
最新更新

Adobe flash cs3 …

FLASH的动态文本如…

由浅入深学习Flas…

用Flash AS三行代…
您现在的位置: 达达派 >> 教程中心 >> FLASH教程 >> 代码篇 >> 教程正文
Flash Actionscript知识:从 AS2 到 AS3
作者:佚名 文章来源:网络采集 点击数: 更新时间:2007-5-21 13:03:09
教程录入:猩猩    责任编辑:猩猩  添加到雅虎收藏+
常量 操作符 参数

随着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= www.webjx.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。具体可以看下图:

Flash Actionscript知识:从 AS2 到 AS3

 下面还是老习惯,来例子示范。首先来一个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类,比较简单,看帮助就好了。

  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    关于我们 | 帮助(?) | 广告服务 | 版权声明 | 商业合作 | 发展历程 | 联系我们

    Copyright ? 2005-2008 CGFancy.com, All Rights Reserved,达达网络:陕ICP备06010337号

    技术交流:71125455(平面)、545534707(三维),业务合作:71125455