您的位置:首页 > 其它

第一章:ActionScript基础

2007-07-13 12:59 253 查看
介绍:使用ActionScript,你可以创建flash程序,作任何你能想到的事情。但是在进入更广阔的范围之前,让我们先了解一下基础。好的消息时ActionScript的命令有定义好的模式,共享相同的语法,结构,和概念。掌握基础的语法可以使你更好的精通ActionScript。
这一章将重点定位在常见的功能和问题上,无论你是一个初学者还是一个专家,这里的一些知识可以让你应付所有的ActionScript工程碰到的问题。
本书假定你已经正确的安装了Flex Buidler 2到你的电脑上,如果你有3.0版本之前的ActionScript的使用经验,那就再好不过了。
当你进入Flex Builder 2的时候eclipse IDE将会向你展示欢迎界面,还有一些开始的选择和Flex,ActionScript3.0的信息展示给你,例如文档,入门教程,等等。你可以点击tab的小“x”来关闭它。现在你在Eclipese IDE里,准备好编写代码了,但是我们从那里开始呢?
Flex Builder2允许你创建三种类型的工程:Flex project,Flex library project,ActionScript project。不同之处是Flex project允许我们进入整个Flex Framework,它里面包含了所有的Flex 组件,布局管理,变形,格式,标题,数据邦定,还有其它一些创建RIA程序所必需的材料。Flex程序写在MXML文件中,MXML文件描述了组件之间的联系和布局,它使用ActionScript作为业务逻辑,尽管你可以使用在本书学到的ActionScript知识到你的Flex程序中,但是本书的集中在ActionScript工程上。
如果你熟悉Flash8或者之前的Flash IDE,现在获取当你打开Flex Builder2的时候感觉有一些为难,这里没有时间线,没有library,没有画图工具,没有颜色工具。你必须用代码来表达所有的一切,这就是为什么叫它为ActionScript project,而不是Flash project。所以现在让我们开始自己的第一个工程吧!。
创建一个ActionScript工程
问题:你已经打开了Flex Builder 2并且想要创建一个ActionScript工程
解决方法:使用新的ActionScript工程。
讨论:一个ActionScript工程一般由最少一个类文件,一个叫bin的文件夹里边包含swf和html文件组成。并且里边还有一些内部的设定来让编译器知道所有的东西是如何来被编译的。Flex Builder 2为你考虑到了所有的一切,当你创建新的工程的时候。你有好几种途径来创建新的工程,你可以使用菜单File—new—ActionScript Project,或者你也可以直接点做上角的new按钮来新建一个工程,你可以可以点击new旁边的箭头来打开新建列表,它的功能和new完全一样。
不管你以什么样的顺序操作,你应该已经打开新建一个ActionScript工程的对话框,现在你被提示要输入一个工程名,比如ExampleApplication之类的名字,一旦你创建了工程,你就注意到main application杯赋予和工程相同的名字,以as为扩展名。
点击next按钮会提示你设定合适的用户类文件保存路径,附加的库文件,和指定你的输出文件夹来代替bin,现在你只需要使用默认的就可以了,点击exit来关闭向导。
Flex Builder 2现在创建了所有必需的文件和文件夹,并且使用默认的编译设定来编译你的工程,在导航视图中,你应该现在可以看到一个叫ExampleApplication的工程,它里边包含了一个空的bin文件夹河一个叫ExampleApplication.as的类文件。IDE为你自动创建了这个文件并且已经自动在编辑窗口中为你打开,并且,在outline窗口你可以看到这个类的结构,包含方法,属性,和一些import语句。
运行你的程序,你可以按一到两个按钮,一个是想臭虫的按钮,这个按钮使你debug你的程序,意思是你可以输出一些额外的信息到控制台中来debugging你的应用程序,使用trace语句。另外一个是一个绿色的圆圈里边有一个箭头,这个用来运行你的程序。上边的两个按钮都可以创建一个.swf文件和html文件,然后再你的浏览器里边加载html文件。
当然,目前你还没有添加任何的代码到你的程序中,所以你会看到浏览器什么都显示不出来。但是为了检测你做好了所有的事情,你应该能得到一个蓝色背景的页面。

设置应用程序的属性
问题:你想改变输出的.swf文件的尺度,背景色,frame rate。
解决:在类文件里边设定ActionScript和metadata的属性。
讨论:和以前的flash不同的是,ActionScript3.0编译器实际上是命令行编译器。技术上说就是你可以在命令行创建所有的类文件和库文件,然而,如果让Eclipse为你做这些事情的话就会变得更加的简单了。
当你创建了一个新的ActionScript工程的时候,它就设定了默认尺度500*375和帧频24每秒,还有就是背景色如你看到的样子,你可以改变任何这些设置,或者就像你想得一样,这里有很多方法可以做这件事情。
第一种方法是设定ActionScript的编译参数,你可以在导航窗口里边点击ActionScript,然后右键,选择Properties,在打开的窗口里边选择ActionScript Compiler,打开的窗口里边可以设定几个选项让编译器如何为你工作。看那个标示为“Additonal compiler argument”的文本框,任何你想传递给编译器的数据写在这里就可以被传递到命令行去。
这里是一些很普通的你需要使用的参数:
-default-size width height

-default-background-color color

-default-frame-rate fps

我们设置如下:
[align=left]-default-size 800 600[/align]
[align=left]-default-background-color 0xffffff[/align]
-default-frame-rate 31
这里我们把.swf文件的大小设置为800*600,第二条把背景色设置为白色,最后一条把帧频设置为31fps,多个参数一个接一个的写上就可以了,如:
-default-size 600 800 –defualt-background-color 0xfffff –defualt-rate 31
第二种改变这些参数的方法是通过你的主类文件的metadata,Metadata由那些不直接解释为ActionScript的语句组成,但是编译器会用它来判断如何来编译最终的输出文件。和之前的语句对应的metadata看起来如下边的样子:
[SWF(width="800", height="600", backgroundColor="#ffffff", frameRate="31")]
这一段放在主程序包里边,但是要放在任何类定义的外边,一般我们都放在import之前或者之后。

在那里放置ActionScript代码
问题:你现在已经有一个ActionProject的工程了,你需要知道在那里边写代码以使它能很好的执行。
解决:把代码放在构造器里边或者给类添加的方法里边。
讨论:在ActionScript1.0和2.0。你会有很多的选择来布置你的代码,在时间线,在按钮上,或者影片剪辑里,在内部的.as文件中,使用#include包含进来,或者使用外部的类文件。ActionScriopt3.0是纯粹的基于类的,所以所有的代码必须都放在类里边的方法中。
当你创建了一个新的ActionScript工程,主类就相应的被创建了,在代码视图中打开这个文件,它应该看起来如下所示:
package {
import flash.display.Sprite;
[SWF(height="800",width="600",backgroundColor="#2fffff",frameRate="31")]
public class ExampleApplication1 extends Sprite
{
public function ExampleApplication1()
{

}
}
}
可能你已经对ActionScript2.0很熟悉了,但是这里还是有一些新的东西,我们将在第二章来详细的说明这些不同的地方,让我们来看看种类的一些基础的概念吧。
第一个你需要注意的事情就是package这个词,Packages用来把一些功能有联系的类组织到一起。在ActionScript2.0,packages通过目录结构来组织类文件,在ActionScript3.0里边,你必许显示的指定包,例如,你可能有一个些边写好的类,想把它们放到同一个包里边去,这里的申明看起来如下:
如package com.as3cb.utils{
}
如果你不指定一个包的名字,你的类被默认的创建在最高的package里边,你也可以在包里边使用package关键字和braces。
接下来,放置import语句,导入一个类文件使的这个类可以被其他的代码使用,并且你设置了一个捷径,你不用再每次使用这个类的时候使用完全路径名,而只需要使用类名即可。比如,你可以使用如下的import语句:
Import com.as3ab.utils.StringUtils;
之后,你就可以直接使用StringUtils而不用其他的路径(如果你熟悉.net编程,这里的概念very easy)。由于每一个类都默认的继承自Sprite类,所以我们必须导入flash.display。
接下来是main类,ExampleApplication,你或许已经注意到了关键字public,尽管你不能在一个包里边有private类,但是你必须标示一个类为public。注意main类继承了Sprite类,并且,一个.swf本身就是一个sprite或者movie clip,这就是为什么你可以在一个.swf里边可以去调用另外一个.swf文件,因为这种情况下只是一个内嵌的sprite或者movie clip。这个main类表示整个.swf文件,因此它必须从Sprite类继承或者从其他的继承自sprite的类(如movieclip)。
最后,这里有一个public的函数(或者方法),它的名字和包含它的main类的名字相同,这个方法叫构造器(constructor),一个类的构造器当这个类的实例被创建的时候自动的执行,在这种情况下,它在.swf文件被装载到Flash Player的时候执行。因此,你应该把代码放到哪里呢?一般的,你先从把一些代码放到构造器里边开始,这里有一个简单的例子,我们只是简单的在屏幕上画一些随机的线:
[align=left]package {[/align]
[align=left] import flash.display.Sprite;[/align]
[align=left]public class ExampleApplication extends Sprite {[/align]
[align=left]public function ExampleApplication( ) {[/align]
[align=left]graphics.lineStyle(1, 0, 1);[/align]
[align=left] for(var i:int=0;i<100;i++) {[/align]
[align=left] graphics.lineTo(Math.random( ) * 400, Math.random( ) * 400);[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left] }[/align]
}
保存并且运行程序,你会在浏览器里边看到一些杂乱无章的线,就像你看到的那样,构造器在文件装入Flash Player之后立即执行。
在实际中,你很少有机会需要把代码写在构造器里边,理想情况下构造器只需要包含一个对其他初始化方法的调用,参考创建可复用的代码泛化方法来提高可复用节。
作为一个新手,现在你知道了如何进入代码,这里有一些术语的primer。这些定义都很简短,为了给那些新手一些启发,如果你想看到一些详细的定义,请参考help文档。
参数:……..
函数……..
如何向控制台发送信息
问题:你需要输出一条消息或者一些数据的值在运行的时候
解决:使用tarce函数,给这个函数一个参数,然后运行你的程序,你会在控制台(Console)看到输出。
讨论:你可以输出一个信息,或者数据值,或者参数值,只需要把这些值传给trace的参数,就像你在之前的ActionScript版本里边干的那样。例如:
[align=left]trace("Hello, world");[/align]
[align=left]trace(userName);[/align]
trace("My name is " + userName + ".");
.swf文件装载到浏览器之后,它会发现没有办法显示这些输出的信息,幸运的是,这是可能的,这个函数已经内建在Flex Builder 2里边了,通过Console窗口我们可以看到这些输出。Console输出和Flash IDE里边的output一样,尽管在你开始运行Eclipse的时候,它在需要的时候会出现。
我们唯一使用trace和console窗口的情况是在debug你的程序的时候,这样做就在.swf文件包含其它的特性,它允许你和后台的console有交互,传递一些信息到后台显示出来。下边的例子创建了一个变量,给它赋值,然后把它输出到控制台,这里使用了一些string数据
[align=left]package {[/align]
[align=left] import flash.display.Sprite;[/align]
[align=left]public class ExampleApplication extends Sprite {[/align]
[align=left]public function ExampleApplication( ) {[/align]
[align=left] var userName:String = "Bill Smith";[/align]
[align=left] trace("My name is " + userName + ".");[/align]
[align=left]}[/align]
[align=left]}[/align]
}
现在,如果你debug你的程序,它会像以往一样在浏览器里边加载,关闭浏览器回到Eclipse,你能在console窗口里边看到你要输出的数据。
如果你启动debug版本的程序,你必须有debug版本的Flash Player,如果你没有debug版本的Flash Player,你就会看到错误信息提示你,你必须下载安装它从http://www.adobe.com/support/flashplayer/downloads.html.
附加的,debug版本的Flash Player能把输出写入到一个文件中,Flash Player使用的配置文件是mm.cfg,这个文件因为操作系统的不同会放在不同的地方,如下:
Windows XP C:/Documents and Settings/[user name]/mm.cfg
Windows 2000. C:/mm.cfg
Mac OS X MacHD:Library:Application Support:macromedia:mm.cfg
Mm.cfg允许你配置以下一些参数:
TraceOutputFileEnable:可以设置为0或者1,1代表写入文件,0代表不是
TraceOutputFileName:写入文件的路径,如果不配置,就会写入mm.cfg所在的文件夹下的一个叫flashlog.txt的文件中
TraceReportingEnable:默认是0代表不把错误写入日志,1代表写入日志
MaxWarning:控制写入日志的错误的个数,默认是0,如果是比零大的数字,就以那个数字为准
Mm.cfg文件最少也的包含下边的一行:
TraceOutputFileEnable=1
如果你想指定多余一个的变量,你必须分开行写:
TraceOutputFileEnable=1

TraceOutputFileName=C:/flex.log


处理事件
问题:你想让一些代码重复的执行
解决:添加一个listener到enterFrame evevt并且关联一个方法作为事件处理handler
讨论:在ActionScript2.0处理enterFrame 事件非常简单,你只是简单的创建一个timelinie function 叫OnEnterFrame ,在每次一个新的frame开始的时候它就自动的执行。在ActionScript3.0,你必须对它有更多的控制在一个.swf文件中,但是只是一点点工作。
如果你对2.0里边的EventDispatcher类比较熟悉的话,现在你已经对3.0处理事件比较了解了,实际上,EventDispatcher已经从一个外部的类发展成现在已经是基础的类了,就如同sprites一样。
为了反应enterFrame event,你必须告诉应用程序去listen这个事件,并且告诉应用程序当这个事件发生的时候执行什么样的方法,整个可以通过addEventListener方法来实现,它的定义:addEventListener(type:String, listener:Function),它还有一些其它参数的版本,整个只是最常用的一个。
Type参数输入的是你想listen的envent的类型,在这里,这个参数是“enterFrame”。然而,使用字符串在这里有些时候会造成错误,致使编译器无法捕捉。例如你不小心把事件的名字给弄错了,那你的应用程序就不断的在listen错误的事件,永远也听不到。为了杜绝这些错误,你可以使用Event类的一些静态的属性,如果你已经把event类import进来的话,你就可以调用addEventListener方法如下:
AddEvnetListener(Event.ENTER_FRAME,OnEnterFrame);
现在,如果你输入错误的时间名,编译器就会抱怨找不到这样的事件。
第二个参数,onEnterFrame,涉及到另外的一个类的方法。我们在事件的处理方法的名字前边加上on是一个习惯的做法,这个方法会接受Event类的一个实例当它被调用的时候,因此,你必须导入Event类在这个方法定义的时候必须接收一个Event对象:
Import flash.evnets.Event;
Private function onEnterFrame(event:Event){
}
Event参数包含一些需要的信息也许在处理的时候很有用,即使你不使用这些信息,你也必须接收这个参数。
这里有一个例子用来画随机的线,用到所有的上边提到的概念:
package {

import flash.display.Sprite;

import flash.events.Event;

public class ExampleApplication extends Sprite {

public function ExampleApplication( ) {

graphics.lineStyle(1, 0, 1);

addEventListener(Event.ENTER_FRAME, onEnterFrame);

}

private function onEnterFrame(event:Event):void {

graphics.lineTo(Math.random( ) * 400, Math.random( ) * 400);

}

}

}

响应鼠标和键盘的事件
问题:我们想对鼠标和键盘的事件作一些响应
解决:对鼠标和键盘的时间进行Listen
讨论:处理鼠标和键盘的事件和处理enterFrame事件非常的类似,如同的前边介绍的一样,但是还是需要一些工作。Mouse的事件来说,main类不会直接接收这个事件,因此我们必须在表示列表里边用另外一个对象来接受。(在第五章我们会详细的介绍)下边的例子创建了一个sprite,把它添加到显示列表中,然后再他里边画一个矩形:
[align=left]package {[/align]
[align=left] import flash.display.Sprite;[/align]
[align=left] import flash.events.MouseEvent;[/align]
[align=left]public class ExampleApplication extends Sprite {[/align]
[align=left] private var _sprite:Sprite;[/align]
[align=left]public function ExampleApplication( ) {[/align]
[align=left] _sprite = new Sprite( );[/align]
[align=left] addChild(_sprite);[/align]
[align=left] _sprite.graphics.beginFill(0xffffff);[/align]
[align=left] _sprite.graphics.drawRect(0, 0, 400, 400);[/align]
_sprite.graphics.endFill( );
注意mouse event定义在MouseEvent类里边,事件处理方法会接受一个MouseEvent类的实例,因此你必须import MouseEvent类,你可以添加listeners到这个sprite:
[align=left]_sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);[/align]
[align=left] _sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);[/align]
[align=left] 接着,定义两个事件处理函数onMouseDown和onMouseUp:[/align]
[align=left]private function onMouseDown(event:MouseEvent):void {[/align]
[align=left] _sprite.graphics.lineStyle(1, 0, 1);[/align]
[align=left] _sprite.graphics.moveTo(mouseX, mouseY);[/align]
[align=left] _sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);[/align]
[align=left]}[/align]
[align=left] private function onMouseUp(event:MouseEvent):void[/align]
[align=left] {[/align]
[align=left] _sprite.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);[/align]
[align=left]}[/align]
[align=left] OnMouseDown方法设定了line style属性,并且把画图光标移动到鼠标的位置,接下来添加了第三个mouse事件MouseMove事件。[/align]
[align=left] OnMouseUp方法使用removeEventListener方法删除了之前listen的事件,它的语法和addEventListener一样,但是它的主要目的是告诉应用程序停止listen特定的事件。[/align]
[align=left] 最后,定义onMouseMove关闭类和package:[/align]
private function onMouseMove(event:MouseEvent):void {

_sprite.graphics.lineTo(mouseX, mouseY);

}

[align=left] 到这里为止我们就创建了一个简单的事件驱动程序。[/align]
[align=left] 接下来我们用一个例子来说明keyDown 事件,把对应的键的字符数出的console。这个例子同样的说明了如何使用传递到方法的evnet对象里边包含的数据,注意keyboard事件使用类KeyboardEvent。[/align]
package {

 import flash.display.Sprite;

import flash.events.KeyboardEvent;

public class ExampleApplication extends Sprite {

public function ExampleApplication( ) {

stage.focus = this;

addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

}

private function onKeyDown(event:KeyboardEvent):void {

trace("key down: " + event.charCode);

}

}

}

[align=left]使用数学操作符号[/align]
[align=left] 问题:你需要在有些时候改变一些东西,比如sprite的位置和旋转。[/align]
[align=left] 解决:使用符合赋值操作符来增加一个属性,或者,加一或者减1操作,你也可以使用前缀表达式或者后缀表达达到同样的目的。[/align]
[align=left] 赋值运算符把右边的数据保存到左边的变量中去,或者保存到某个属性中去。因此,如果你修改了右边的数据,左边的也会发生相应的修改。[/align]
[align=left] 尽管下边的代码看起来会有一些奇怪(我觉得一点都不奇怪,呵呵),对于熟悉basic glgebra的人来说,但是这在我们平时的使用中是非常普遍的:[/align]
[align=left]// Add 6 to the current value of quantity, and assign that new [/align]
[align=left]// value back to quantity. For example, if quantity was 4, this [/align]
[align=left]// statement sets it to 10.[/align]
[align=left]quantity = quantity + 6;[/align]
[align=left] 然而,在我们平时的使用中,我们喜欢使用更加方便的符合运算符。比如+=,-=,*=,/=他们非常的流行,他们的效果和上边的一样。[/align]
[align=left] 还有比如自加和自减的和c语言基本一样:[/align]
[align=left] Var quanlity:Number=5;[/align]
[align=left] Quanlity++;6[/align]
[align=left] Quanlity--:5[/align]
[align=left] 回到我们原始的问题,我们使用这些操作符来改变一个属性的值,如:[/align]
[align=left]private function onEnterFrame(event:Event) {[/align]
[align=left] _sprite.rotation += 5;[/align]
[align=left]}[/align]
[align=left] 注意在ActionScript3.0,你必须添加事件到main 类。[/align]
[align=left] [/align]
[align=left]等值检测和值得比较[/align]
[align=left] 问题:你想检测两个值是不是相等[/align]
[align=left] 解决:使用等值或者严格的等值比较操作符来比较两个值,为了检测一个值是不是有效,使用isNaN()。[/align]
[align=left] 讨论:等值表达式总是返回一个bool类型的值来表示比较的两个值是不是相等,等值操作符有规则的和严格的两种。规则的等值和不等值操作符检查表达式里两个值是不是相等,如果他们的类型不一样,就把他们转换成相同的数据类型来执行检测。比如我们检测6==“6”,这里是相等的是因为在执行检测之前已经把字符串的6转换成了int类型的6:[/align]
[align=left]trace(5 == 6); // Displays: false[/align]
[align=left]trace(6 == 6); // Displays: true[/align]
[align=left]trace(6 == "6"); // Displays: true[/align]
[align=left]trace(5 == "6"); // Displays: false[/align]
[align=left] 注意在默认的配置下,上边的代码是不会通过编译的,这是因为我们的编译器执行的事严格的检查,导致了编译器会比较严格的检查类型。编译器会抱怨在代码中有对string类型和int类型的比较。为了关闭strict 标示位,回到前边我们介绍的对编译器的参数的设置小节,把Enable compile-time type checking strict 去掉。这只是在这里这样做,在大多数情况下我们需要这样的检测,为了防止一些我们疏忽的错误。[/align]
[align=left] 逻辑不等操作符号在两个值相等的时候返回false而在不相等的时候返回true,如果需要比较的两个值也会被转换成相同的类型在执行比较之前:[/align]
[align=left]trace(5 != 6); // Displays: true[/align]
[align=left]trace(6 != 6); // Displays: false[/align]
[align=left]trace(6 != "6"); // Displays: false[/align]
[align=left]trace(5 != "6"); // Displays: true[/align]
[align=left] 这里也需要strict开关。[/align]
[align=left] 从另外一个方面说,如果你关闭了strict开关,但是你又想做一些strict比较在一段代码上,你可以使用strict等值和不等值操作符号,= = =和!= =。这些操作符号首先检查比较的两个值的类型是不是一样,不同的类型会导致这些操作符号返回false或者ture。[/align]
[align=left]trace(6 === 6); // Displays: true[/align]
[align=left]trace(6 === "6"); // Displays: false[/align]
[align=left]trace(6 !== 6); // Displays: false[/align]
[align=left]trace(6 !== "6"); // Displays: true[/align]
[align=left] 使用错误的操作符号会导致不可预期的结果,在下边的例子中,quanlity等于5,因此你可能期望if语句里的trace永远不会执行:[/align]
[align=left]var quantity:int = 5;[/align]
[align=left]// The following code is wrong. It should be if (quantity == 6) instead[/align]
[align=left]if (quantity = 6) {[/align]
[align=left] trace("Rabbits are bunnies.");[/align]
[align=left]}[/align]
[align=left]trace("quantity is " + quantity); // Displays: quantity is[/align]
[align=left] 然而,例子中错误的在该使用等值比较符号的地方使用了赋值操作符号。你可能认为上边代码中的trace会被执行,但是3.0足够的聪明,这样的代码会被编译通过,但是不会执行,你也不会得到任何的警告。[/align]
[align=left] 你可以使用is检测一个对象的类型:[/align]
[align=left]var quantity:int = 5;[/align]
[align=left]if (quantity is int) {[/align]
[align=left] trace("Yippee. It's an integer.");[/align]
[align=left]}[/align]
[align=left] 然而,一些数值是无效的,下边的例子中quantity会被置成NaN,因为计算表达式不是一个有意义的式子。[/align]
[align=left] var quantity:Number = 15 - "rabbits";[/align]
[align=left] 不管它的名字,NaN被认为是Number数据类型:[/align]
[align=left] trace(typeof quantity); // Displays: "number"[/align]
[align=left] 因此,为了测试一个数值不仅仅是数值,还有它是不是有效,如下:[/align]
var quantity:Number = 15 - "rabbits";

[align=left]if (quantity is Number) {[/align]
[align=left] // Nice try, but this won't work[/align]
[align=left] if (quantity != NaN) {[/align]
[align=left] trace("Yippee. It's a number.");[/align]
[align=left] }[/align]
[align=left]}[/align]
注意:你不能简单地比较常量NaN来判断一个数值是不是有效,ActionScript3.0编译器会给你一个警告如果你这样用的话,你必须使用特殊的函数isNaN()来完成这件事情。
为了确定一个数值是不是有效,我们使用特殊的方法isNaN(),如下:
[align=left]var quantity:Number = 15 - "rabbits";[/align]
[align=left]if (isNaN(quantity)) {[/align]
[align=left] trace("Sorry, that is not a valid number.");[/align]
}
为了测试相反的一面,使用not操作符号!,比如,为了检测一个变量是不是有效,可以做如下的测试:
[align=left]var quantity:Number = 15 - "rabbits";[/align]
[align=left]if (!isNaN(quantity)) {[/align]
[align=left] [/align]
[align=left] // The number is not invalid, so it must be a valid number[/align]
[align=left] trace ("That is a valid number.");[/align]
}
当然,你也可以使用很多著名的比较操作符号,比如你可以使用<和>来检测一个值是不是大于或者小于另外一个值:
[align=left]trace(5 < 6); // Displays: true[/align]
trace(5 > 5); // Displays: false
同样的你也可以使用<=和>=两个操作符号来比较两个值:
[align=left]trace(5 <= 6); // Displays: true[/align]
trace(5 >= 5); // Displays: true
你应该注意ActionScript在作比较的时候根据不同的数据类型而不一样。ActionScript有两种数据类型,原始类型(string,number,bool)和组合类型(object,sprite,array)。当你比较原始类型的时候,ActionScript用值来比较他们,在下边的例子中,两个变量相等是因为他们包含了相同的值6:
[align=left]var quantity:Number = 6;[/align]
[align=left]var total:Number = 6;[/align]
trace (quantity == total); // Displays: true
然而,当你比较组合类型的时候,ActionScript使用引用类比较他们。使用引用来比较item意味着两个变量相等则他们指向相同的对象,不仅仅是对象有相同的内容,例如,两个数组有相同的值但是他们不相等:
[align=left]// Create two arrays with the same elements.[/align]
[align=left]var arrayOne:Array = new Array("a", "b", "c");[/align]
[align=left]var arrayTwo:Array = new Array("a", "b", "c");[/align]
trace(arrayOne == arrayTwo); // Displays: false
两个组合对象相等意味着他们引用到相同的对象,数组,sprite,例如:
[align=left]// Create a single array[/align]
[align=left]var arrayOne:Array = new Array("a", "b", "c");[/align]
[align=left]// Create another variable that references the same array.[/align]
[align=left]var arrayTwo:Array = arrayOne;[/align]
trace(arrayOne == arrayTwo); // Displays: true

ActionScript的条件语句
问题:你想在某些条件下来执行一些操作
解决:使用if或者switch语句
讨论:你经常需要你的ActionScript做一些决定,比如执行特定的一些操作,或者一组操作。为了在一定的情形下执行一些操作,使用ActionScript的条件语句if,switch或者三重条件操作符?:。
条件语句允许你做逻辑上的决定,你会学到很多的经验在给定的情况应该用那个。比如,if语句在你告诉Flash movie在特定情况满足的情况下作一些事情的时候比较有用。当有好几个可能的情况需要测试的时候,你可以使用switch语句,你也可以使用三重条件操作符来做这些事情。
首先让我们来学习if语句,由于if语句的使用和C#中的没有什么两样,所以这里不作详细的说明,大家看一些例子:
[align=left]if (animalName == "turtle") {[/align]
[align=left] // These statements execute only when animalName is equal [/align]
[align=left] // to "turtle".[/align]
[align=left] showMessage("Yay! 'Turtle' is the correct answer.");[/align]
[align=left]}[/align]
[align=left]else {[/align]
[align=left] // These statements execute only when animalName is not equal [/align]
[align=left] // to "turtle".[/align]
[align=left] showMessage("Sorry, you got the question wrong."); [/align]
}
还有:
[align=left]if (animalName == "turtle") {[/align]
[align=left] // This trace( ) statement executes only when animalName is equal [/align]
[align=left] // to "turtle".[/align]
[align=left] showMessage ("Yay! 'Turtle' is the correct answer.");[/align]
[align=left]}[/align]
[align=left]else if (animalName == "dove") {[/align]
[align=left] // This trace( ) statement executes only when animalName is not [/align]
[align=left] // "turtle", but is "dove".[/align]
[align=left] showMessage ("Sorry, a dove is a bird, not a reptile.");[/align]
}
接下来我们来看一下switch,同样我只给一些例子:
[align=left]var animalName:String = "dove";[/align]
[align=left] [/align]
[align=left]// Now, only the second trace( ) statement executes.[/align]
[align=left]switch (animalName) {[/align]
[align=left] case "turtle":[/align]
[align=left] trace("Yay! 'Turtle' is the correct answer.");[/align]
[align=left] break;[/align]
[align=left] case "dove":[/align]
[align=left] trace("Sorry, a dove is a bird, not a reptile.");[/align]
[align=left] break;[/align]
[align=left] default:[/align]
[align=left] trace("Sorry, try again.");[/align]
}
另外,switch语句在一些特殊情况下很有用,比如你想在几个满足的条件下执行相同的操作,简单的把一些case表达式一个一个列在一起,例如:
[align=left]switch (animalName) {[/align]
[align=left] case "turtle":[/align]
[align=left] case "alligator":[/align]
[align=left] case "iguana":[/align]
[align=left] trace("Yay! You named a reptile.");[/align]
[align=left] break;[/align]
[align=left] case "dove":[/align]
[align=left] case "pigeon":[/align]
[align=left] case "cardinal":[/align]
[align=left] trace("Sorry, you specified a bird, not a reptile.");[/align]
[align=left] break;[/align]
[align=left] default:[/align]
[align=left] trace("Sorry, try again.");[/align]
}
ActionScript3.0也支持问号表达式,如下:
varName = (conditional expression) ? valueIfTrue : valueIfFalse;

表达一些复杂的条件测试
问题:你想在多重条件下作决定
解决:使用逻辑与(&&),逻辑或(||),和求反(!)来创建复合条件语句。
讨论:许多的ActionScript都可以涉及条件表达式,包括if,while,for语句,和三元操作符号。为了测试两个条件都为ture,使用逻辑与操作符号,如下:
[align=left]// Check if today is April 17th.[/align]
[align=left]var current:Date = new Date( );[/align]
[align=left]if (current.getDate( ) == 17 && current.getMonth( ) == 3) {[/align]
[align=left] trace ("Happy Birthday, Bruce!");[/align]
}
你也可以添加额外的括号来使代码更加的清晰和有逻辑:
[align=left]// Check if today is April 17th.[/align]
[align=left]if ((current.getDate( ) == 17) && (current.getMonth( ) == 3)) {[/align]
[align=left] trace ("Happy Birthday, Bruce!");[/align]
}
由于这些逻辑运算符号的使用基本上同c,c#,java一样,所以这里只给一些例子:
[align=left]// Check to see if the name is not Bruce.[/align]
[align=left]if (!(userName == "Bruce")) {[/align]
[align=left] trace ("This application knows only Bruce's birthday.");[/align]
}
[align=left]// Check to see if a sprite is visible. If so, display a[/align]
[align=left]// message. This condition is shorthand for _sprite.visible == true[/align]
[align=left]if (_sprite.visible) {[/align]
[align=left] trace("The sprite is visible.");[/align]
}
[align=left]// Check to see if a sprite is invisible (not visible). If so, [/align]
[align=left]// display a message. This condition is shorthand for [/align]
[align=left]// _sprite.visible != true or _sprite.visible == false.[/align]
[align=left]if (!_sprite.visible) {[/align]
[align=left] trace("The sprite is invisible. Set it to visible before trying this action.");[/align]
}
[align=left]// Check to see if the name is neither Bruce nor Joey. (This could[/align]
[align=left]// also be rewritten using two inequality operators and a logical[/align]
[align=left]// AND.)[/align]
[align=left]if (!((userName == "Bruce") || (userName == "Joey"))) {[/align]
[align=left] trace ("Sorry, but only Bruce and Joey have access to this application.");[/align]
}

重复执行一个操作多次
问题:在一个frame里边执行一些工作多次
解决:使用循环语句来执行一些相同的操作多次在一个单独的frame里边,你可以使用for语句:
[align=left]// Check to see if the name is neither Bruce nor Joey. (This could[/align]
[align=left]// also be rewritten using two inequality operators and a logical[/align]
[align=left]// AND.)[/align]
[align=left]if (!((userName == "Bruce") || (userName == "Joey"))) {[/align]
[align=left] trace ("Sorry, but only Bruce and Joey have access to this application.");[/align]
}
讨论:由于这里的for语句基本上和其他语言的相同,给一些代码:
[align=left]for (var i:int = 0; i < 1000; i++) {[/align]
[align=left] trace(i);[/align]
[align=left]}[/align]
trace ("That's the end.");
[align=left]for (var i:int = 0, j:int = 10; i < 10; i++, j--) {[/align]
[align=left] trace("i is " + i);[/align]
[align=left] trace("j is " + j);[/align]
}
[align=left]for (var i:int = 1; i <= 3; i++) {[/align]
[align=left] for (var j:int = 1; j <= 2; j++) {[/align]
[align=left] trace(i + " X " + j + " = " + (i * j));[/align]
[align=left] }[/align]
}
[align=left]for (var i:int = 1; i <= 3; i++) {[/align]
[align=left] for (var j:int = 1; j <= 3; j++) {[/align]
[align=left] for (var k:int = 1; k <= 3; k++) {[/align]
[align=left] trace(i + " X " + j + " X " + k + " = " + (i * j * k));[/align]
[align=left]}[/align]
[align=left] }[/align]
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: