从基础开始深入FlashAS3教程译文.docx
《从基础开始深入FlashAS3教程译文.docx》由会员分享,可在线阅读,更多相关《从基础开始深入FlashAS3教程译文.docx(23页珍藏版)》请在冰豆网上搜索。
![从基础开始深入FlashAS3教程译文.docx](https://file1.bdocx.com/fileroot1/2023-2/22/4f76daa4-b6c6-40fa-930f-e93d6e180357/4f76daa4-b6c6-40fa-930f-e93d6e1803571.gif)
从基础开始深入FlashAS3教程译文
从基础开始深入FlashAS3教程
(1)(译文)
在AS3中,你可以使用Stage类动态的修改影片的帧频。
Stage类(,使用下面的代码:
//将帧频修改到12帧每秒(FPS)
stage.frameRate=12;
类方法的作用域和类绑定在一起
AS3完全基于类构造。
当一个类被创建的时候,类中的参数,变量,方法或任何实例都同时被创建。
和AS2不同,AS3中的方法在执行的时候,将使用和类同样的作用域。
例如下面的代码:
package{
import;
publicclassClassScopeextendsSprite{
publicfunctionClassScope(){
traceThis();//输出"ClassInstance"
varobj:
Object=newObject();
obj.traceThis=traceThis;
obj.traceThis();//输出"ClassInstance"
traceThis.call(newSprite());//输出"ClassInstance"
}
publicoverridefunctiontoString():
String{
return"ClassInstance";
}
publicfunctiontraceThis():
void{
trace(this);
}
}
}
图形对象和绘图API
和AS1和AS2一样,AS3也提供了绘图API来绘制矢量线段和图形。
但是在AS3中,绘图API将独立于显示对象(displayobjects:
MoiveClip,sprites等)而被定义为图形对象(,图形内容将在所有对象的最下层。
同时,在AS3中有一些新的方法来帮助你方便的绘制简单的图形。
包括:
园:
drawCircle(x:
Number,y:
Number,radius:
Number):
void
椭圆:
drawEllipse(x:
Number,y:
Number,width:
Number,height:
Number):
void
矩形:
drawRect(x:
Number,y:
Number,width:
Number,height:
Number):
void
圆角矩形:
drawRoundRect(x:
Number,y:
Number,width:
Number,height:
Number,ellipseWidth:
Number,ellipseHeight:
Number):
void
代码举例:
//绘制一个蓝色的圆角矩形
varsquare:
Sprite=newSprite();
;
0,100,50,10,10);
;
addChild(square);
4,新的变量类型
AS3中有许多新的数据类型。
其中有些类型是以前没有出现的。
AS3中的基本数据类型如下:
简单数据类型:
Boolean
int
null
Number
String
uint
undefined
复杂数据类型:
Object
Array
Date
Error
Function
RegExp
XML
XMLList
新的数据类型通过类来定义,例如:
Matrix(
Shape((
等等。
注意:
特殊类型Void在AS3中被改成了全小写:
void。
“*”可以用来代表所有数据类型。
如下:
varanything:
*;
AS3中的XML和AS1和AS2中完全不一样。
以前的XML类型(对象)被定义为XMLObject。
AS3中的XML是标准的E4X-basedXML对象。
int和uint是number类型的新扩展,int表示整型(没有小数),unit是无符号整型(不能是十进制,不能是负数)。
使用int型比使用Number能稍微的提升运行效率,而uint型只应该使用在必须的地方,比如颜色值。
5,显示对象
AS3有一个新的集合:
显示对象。
这个集合包含了所有可以在舞台上看到或者可以被添加到显示列表中的对象,包括以前的MovieClip,button和textField对象。
AS3的显示对象有:
AVM1Movie
Bitmap
Loader
MorphShape*
MovieClip
Shape
SimpleButton
Sprite
StaticText*
TextField
Video
有*的表示此对象必须在舞台上手动创建,不能直接通过AS创建。
AVM1Movie是使用AS1和AS2创建的Movie,AS3创建的Movie需要通过AVM2来播放。
因此用AS1和AS2创建的Movie在AVM2中被作为一个显示对象来播放。
但是不能和AS合使用。
Bitmaps是位图对象。
可以通过BitmapData对象来指定显示效果,也可以通过位图文件来设定。
Loader对象用来加载和显示外部的image和swf影片文件。
MorphShapes是在时间轴上创建的图形。
虽然不能通过AS创建,但是可以通过AS来引用和控制。
MovieClips人人都会用
Shapes是从MovieClip中分离出来一个只有graphics对象的图形容器。
在shape中可以通过graphics对象使用绘图API绘制各种图形。
使用shape代替MovieClip可以减少内存负担。
Sprite是没有时间轴的MovieClip,在AS3使用中,可能会在很多地方使用sprite代替MovieClip,尤其在创建自定义的显示组件时。
StaticText和MorphShapes一样,不能通过AS创建,这是在时间轴上创建的文本对象。
TextField,文本对象。
Video对象,播放flash视频。
6,新的import标识
AS3中的import标识和AS2中有一些不同。
在AS2中,import被用来代理引用类的长名称,在类中并不是必须的。
因此在AS2中,如果你不使用import,你也可以使用类的长名称来引用,例如:
//ActionScript2
varmyPoint:
=new,0);
在AS3中,import标识是访问类的必须标识。
在使用到其他类的时候,也可以使用类的长名称,但是import不能省略掉。
例如:
//ActionScript3
import;
varmyPoint:
=new,0);
和AS2一样,import中可以使用通配符(*)来导入整个包:
importflash.geom.*;
类型转换和as操作符
AS允许在需要的时候,将对象的类型改成另外一种匹配的类型,这就是类型转换。
AS2和AS3都支持通过像“type(object)”这样的方式进行类型转换。
例如,现定义一个数据类型为Object,你可以通过使用类型名称的语法将这个数据转换成另外一种数据类型。
如:
varobj:
Object=getMyCustomObject();
vaycustomObj:
MyClass=MyClass(obj);
AS3引入了一种新的操作符“as”来进行类型转换。
as操作符代替了类型名称语法来改变对象的数据类型。
如:
varobj:
Object=getMyCustomObject();
vaycustomObj:
MyClass=objasMyClass;
as操作符的工作方式和AS2中的非常类似。
如果转换不可能进行,那么转换的返回值是null。
AS3依旧支持通过type(object)的方式来转换类型,但是,这种方式和以前有一点细微的不同。
以前转换失败是返回null,现在转换失败后将抛出一个类型错误(TypeError)。
当尝试转换两种对立的数据类型的时候就会失败。
例如将一个数据类型转换成另外一个不可能通过联合和继承而得到的类型。
注意:
AS上的全局转换方法Class(object)的优先级依旧高于type(object)转换方法。
这些方法包括String(),Number(),和Array()等。
7,唯一的类变量
(本文非直接翻译,原文如下:
)
InActionScript2,variablesdefinedwithinaclass'sbodyweredefinedintheclass'sprototypeobject.Thiswasanefficientmeanstohandlevariabledefinitionsbutitalsomeantthatcomplexdatatypes(suchasArrays)hadatendencytobe"shared"amonginstancesifnotexplicitlydefinedforinstanceswithintheclassconstructor.ThisisnolongeraproblemwithActionScript3.Classvariablesdefinedintheclassbodyarenowuniquetoeachclassinstancesothisproblemnolongeroccurs.
在AS2中,复杂数据类型(比如数组),如果在类体之中,方法之外直接初始化,而不在构造器中初始化,会被理解为“共享”的数据,而被所有的实例共享使用(类似于static的效果)。
但是在AS3中不存在这个问题。
类变量是每个实例独有的,唯一的变量。
如下:
classmyClass{
privatevarlist:
Array=[1,2,3];//在AS2中会有一定问题,AS3中就很好
publicfunctionmyClass(){
//在AS2中,应该在这里初始化list
}
}
8,新的MouseMove行为
mouseMove行为在AS3中有所改变。
以前,mouseMove动作是一个全局概念,也就是说不管鼠标在FlashMovie的任何一个地方,只要移动了,就会触发任何一个MovieClip的mouseMove行为。
在AS3中,Mouse对象不再用来分派(dispath)鼠标行为。
对于mouseMove行为来说,你应该监听一个InteractiveObject的实例,比如Sprites,MovieClip和Stage。
所以,你可能需要使用InteractiveObject来代替Mouse接收监听。
对于每一个InteractiveObject实例,mouseMove行为只在这个对象的所在范围内执行。
如果你要使用全局的mouse事件监听,则需要对stage添加监听。
因此,在使用mouseMove来拖动一个对象的时候,当你的鼠标离开的脱离对象,对该对象的mouseMove事件就会失效,拖动效果也就同时实效了。
这个时候,你可能需要对stage添加move行为来进行监听:
stage.addEventListener(MouseEvent.MOUSE_MOVE,dragMyObject);
10,delete关键字和类成员
delete关键字在Flash中是用来删除定义的变量,但是并不将对象从内存中清除掉(这是垃圾收集器的工作)。
它只是将一个变量的引用设置成无效,让内存中的这个对象无法再被引用和使用,也无法再使用forin来枚举。
事实上,垃圾处理器(GC)将在特定的时候,自动的从内存中删除那些不再被引用和使用的变量。
比如,你创建了两个对象引用A和B,都指向了对对象ObjectX的引用,如果delete了A,并不会让垃圾收集器把ObjectX从内存中删除,因为B的引用还是指向了这个对象。
如果将A和B都delete,则不再有对ObjectX的引用,ObjectX也将被垃圾收集器回收。
例如:
vara:
Object=newObject();
varb:
Object=a;//b和a引用同一个newObject();
deletea;
trace(b);//输出[objectObject]-在内存中还是存在
deleteb;
//GC将回收object
这个特性在Flash8和9(AS123)中几乎都是一样的,但是在Flash8中,GC的一些特性得到改善并能更好的工作。
(注意,垃圾收集不是即时的)
虽然GC在AS3中并没有什么本质上的改变,但是因为使用了新的虚拟机,delete关键字的行为有所改变。
现在,delete关键字只能针对类的动态属性和非公有成员有效。
而在AS1和2中,delete能被用在所有的东西上。
//ActionScript2
classDeleteVarClass{
publicvarmyVar:
Number;
functionDeleteVarClass(){
myVar=1;
trace(myVar);//1
deletemyVar;
trace(myVar);//undefined
}
}
//ActionScript3
package{
publicclassDeleteVarClass{
publicvarmyVar:
Number;
publicfunctionDeleteVarClass(){
myVar=1;
trace(myVar);//1
deletemyVar;
trace(myVar);//1
}
}
}
在上面的AS3例子中,因为myVar变量是一个公有成员,所以不能用delete来删除这个变量。
尽管在AS3中不能删除类成员,但是如果你想删除一个对象的所有引用,可以通过将变量设置为null来代替delete。
如:
myVar=null;
如果一个对象的所有引用都是null,GC将自动的从内存中删除这个对象。
11,Dictionary类
AS3中的Dictionary类(
varobj:
Object=newObject();
obj["name"]=1;//键是字符串"name"
obj[1]=2;//键是1(被转换成字符串"1")
obj[newObject()]=3;//键是newObject(),被转传成字符串"[objectObject]"
for(varprop:
Stringinobj){
trace(prop);//输出:
[objectObject],1,name
trace(obj[prop]);//输出:
3,2,1
}
也就是说,无论用什么类型的变量作为键,都将被转换成字符串。
同时,如果你使用了不同的对象作为键,都会北转换成字符串"[objectObject]"作为键,因此而指向了同一个数据。
例如:
ActionScriptCode:
vara:
Object=newObject();
varb:
Object=newObject();
varobj:
Object=newObject();
obj[a]=1;//obj["[objectObject]"]=1;
obj[b]=2;//obj["[objectObject]"]=2;
for(varprop:
Stringinobj){
trace(prop);//traces:
[objectObject]
trace(obj[prop]);//traces:
2
}
Dictionary类将没有这个限制,你可以将键设置成任何一种数据类型。
例如:
import;
vara:
Object=newObject();
varb:
Object=newObject();
vardict:
Dictionary=newDictionary();
dict[a]=1;//dict[a]=1;
dict[b]=2;//dict[b]=2;
for(varprop:
*indict){
trace(prop);//traces:
[objectObject],[objectObject]
trace(dict[prop]);//traces:
1,2
}
虽然在trace的时候,输出的还是[objectObject],但是这个结果是对象的toString的结果。
在Dictionary对象中,代表的是不同的对象引用。
注意,这里的prop的类型是*。
这是很重要的,因为dict对象中的键可能是任何数据类型的。
12,标签申明
在AS3中引入了标签,新的标签可以和循环体一起使用。
例如,现在有两个嵌套的循环体,如果想要在内循环体中break掉外循环,一般使用下面的方法:
vari:
Number;
varj:
Number;
varexit:
Boolean=false;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(i>3&&j>3){
exit=true;
break;
}
}
if(exit){
break;
}
}
在引入了新的标签以后,可以使用下面的方法从内循环体中直接break掉外循环体:
vari:
Number;
varj:
Number;
mainLoop:
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(i>3&&j>3){
breakmainLoop;
}
}
}
在第一个循环体上设置了mainLoop的标签,因此在循环体内任何地方使用breakmainLoop直接中止外循环。
13,检测鼠标离开Movie的动作
在以前的AS版本中,你无法做到检测鼠标是否还在FlashMovie上。
因此影片不能检测到用户是否在关注着当前的Movie。
另外一个问题是,如果使用了自定义的鼠标样式,在鼠标移出Movie后,自定义的鼠标还是继续停留在影片上,而不能正确的显示鼠标当前的位置。
现在,AS3允许你通过监听stage的mouseLeave行为来捕获鼠标移出Movie的动作。
mouseLeave行为在鼠标移出Movie的时候执行。
但是现在并没有mouseEnter事件,不过你可以通过使用mouseMove来设置。
下面的例子中使用了一个方框来作为自定义的鼠标:
package{
import;
import;
import;
import;
publicclassTestextendsSprite{
privatevarcursor:
Sprite=newSprite();
publicfunctionTest(){
;
0,25,25);
addChild(cursor);
stage.addEventListener(Event.MOUSE_LEAVE,cursorHide);
stage.addEventListener(MouseEvent.MOUSE_MOVE,cursorFollow);
Mouse.hide();
}
publicfunctioncursorHide(evt:
Event):
void{
cursor.visible=false;
}
publicfunctioncursorFollow(evt:
MouseEvent):
void{
if(!
cursor.visible)cursor.visible=true;
cursor.x=stage.mouseX;
cursor.y=stage.mouseY;
evt.updateAfterEvent();
}
}
}
当鼠标离开Movie的时候,鼠标指针将被隐藏。
当鼠标再次移动到Movie上的时候,mouseMove会被执行,然后显示鼠标。
14,SimpleButton实例
AS3现在有一个新的类:
SimpleButton(
varmyButton:
SimpleButton=newSimpleButton();
SimpleButton类有4个属性分别代表按钮的四个不同状态:
upState,overState,downState和hitAreaState。
你可以为每一个状态创建一个新的显示对象,然后将显示对象赋予SimpleButton的各种状态:
myButton.upState=mySprite1;
myButton.overState=mySprite2;
myButton.downState=mySprite3;
myButton.hitAreaState=mySprite4;
15,数组定义中的逗号
本文非直接翻译,原文解释部分如下:
WhendefiningarraysinActionScript3usingtheshorthandarrayaccessoperator(brackets),youcannowhaveatrailingcommafollowingthelastelementwithoutcausinganerror(likeinPHP).Thismakesworkingwithmulti-linearraydefinitionsalittlelesserror-pronewhenrearrangingelements.
先来看一个例子:
varmyList:
Array=[
"The",
"quick",
"brown",
"fox",
];
在AS1和2中,"fox"后的逗号会导致一个编译错误,但是在AS3中不会了。
注意,这个逗号只是在使用[]定义数组的时候有效,使用Array()或newArray()的时候是无效的。
16,包块
AS3中的包定义方式和AS2中有所不同。
在AS3中,包路径不再是类定义的一部分,而是使用一个包块来包含类。
定义包块使用的是package标签,如下:
package{
classMyClass{
}
}
而在AS2中,应该是下面的样式:
//ActionScript2:
class{
}
实际上,在AS3中,所有的类都必须定义在包里面,如果一个类不属于任何一个包,也需要使用空的包路径来定义:
package{
classNotInAPackageClass{
}
}
每一个包块可以将一些有关联的类或者方法包含在一个文件里面。
文件中包块里的类或方法必须使用和文件名相同的名称:
package{
functi