Flash CS3的ActionScript3入门
随着flash cs3的到来,同时提供给我们一个崭新的,针对Adobe Flash(swf)影片和功能程序的标准的程序开发语言。在之前的一段时间里,你可能发现入门ActionScript 3.0与其它版本的ActionScript相比会有一些难度.例如,如果拿ActionScript 1.0到ActionScript 2.0的变化相比的话,那么对于ActionScript变化到ActionScript 3.0可以说是一个比较大的跳跃了。特别是那些倾向于在flash ide中编写代码程序员,这篇文章将帮助你如何在flash cs3 ide中工作。
运行环境
1.Flash CS3
2.有一些ActionScript或是Javascirpt基础
如果不使用CS3或是没有Flash CS3怎么办?你可以从这里学习使用免费的flex 2 sdk来学习ActionScript 3. Beginners Guide to Getting Started with ActionScript 3 (Without Learning Flex)
索引
1.历史简介
2.ActionScript 3 基本的一些不同之处
3.一般性内容
a.Variables 变量
b.Functions 函数
c.Objects/Classes对象/类
d.Events 事件
4.ActionScript和时间线
5.使用Display Objects.
ActionScript历史简介
早期的flash 3中的ActionScript 1.0语法冗长,主要的应用是围绕着帧的导航和鼠标的交互.这种状况一直保持到flash 5. 到flash 5版本时ActionScript已经很象JavaScript了。它提供了很强的功能和为变量的传输提供了点语法。ActionScript同时也变成了一种prototyped(原型)语言,允许类似于在javscript中的简单的oop功能。这些在随后的flash mx(6)版本中得到的增强。
Flash MX2004(7)引入了ActionScript 2.0,它带来了两大改进:变量的类型检测和新的class类语法。ActionScript 2.0的变量类型会在编译时执行强制类型检测。它意味着当你在发布或是编译你的影片时任何指定了类型的变量都会从众多的代码中剥离出来,检查是否与你现有的代码存在矛盾冲突。如果在编译过程中没有发现冲突,那么你的swf将会被创建,没有任何不可理解变量类型的代码将会运行。尽管这个功能对于flash player的回放来说没有什么好处,但对于flash创作人员来它是一个非常的好工具,可以帮助调试更大更复杂的程序。
在ActionScript 2.0中的新的class类语法用来在ActionSctipt 2.0中定义类。它类似于Java语言中的定义。尽管Flash仍不能超越它自身的原型来提供真正的class类,但新的语法提供了一种非常熟悉的风格来帮助用户从其它语言上迁移过来,提供了更多的方法来组织分离出来As文件和包。
接下来我们进入到flash CS3(9;在flash8中没有发生多大的变化)ActionScript 3.这里我们不光有一个带有新的版本号的ActionScirpt 语言,还有一个全新的虚拟机即—Flash Player在回放时执行ActionScript的底层软件。ActionScript 1和ActionScript 2都使用是AVM1(ActionScript 虚拟机1),因此它们在需要回放时本质上是一样的,记得我们在ActionScript2上说过它增加了强制变量类型和新的类语法,它实际上在最终编译时变成了ActionScript 1,而ActionScript 3.0运行在AVM2上,一种新的专门针对ActionScirpt 3代码的虚拟机。基于上面的原因,ActionScript 3.0影片不能直接与ActionScript 1和ActionScript 2影片直接通讯(ActionScript 1和ActionScript 2的影片可以直接通讯,因为他们使用的是相同的虚拟机;如果要ActionScirpt 3影片与ActionScirpt 1和ActionScript 2的影片通讯,只能通过local connection),但是你会发现ActionScript 3的改变更深远更有意义。
下面是各个版本的代码示范:
ActionScript 1
代码:
function Example(){
this.num = 1;
}
Example.prototype.str = "text";
Example.prototype.doubleNum = function(){
this.num *= 2;
}
ActionScript 2
代码:
class Example {
public var num:Number;
private var str:String = "text";
public function Example(){
this.num = 1;
}
public function doubleNum():Void {
this.num *= 2;
}
}
注意当编译时,上面的ActionScript 2类会变成ActionScript 1范例那样。
ActionScript 3
代码:
package {
public class Example {
public var num:Number;
protected var str:String = "text";
public function Example(){
this.num = 1;
}
public function doubleNum():void {
this.num *= 2;
}
}
}
ActionScript 3有怎样的不同呢?
ActionScript 3是不同的,非常的不同。因为不同在实际应用上所以需要一个全新的虚拟机来运行它。但是本质上,它仍是ActionScript,作为 ActionScript你可能 已经注意到了在ActionScript 1和ActionScript 2中的许多命令和程序概念仍然非常好的适用于ActionScript 3.0.尽管上面的范例代码非常小,我们至少可以看出语法已经改变了。在某些地方ActionScript 3.0与ActionScript 2.0代码看上去非常相似但并不总是这样,最终在As2.0与As3.0中直接转换经常会比较困难。
这些改变是非常必要的,在印象中 ActionScript 3.0有很高的功效,在开发过程中不仅是效率(这一点在一些小的但工作量较大的项目中得到证实)还有就是ActionScript 3.0在Flash Player中的回放速度要比ActionScript 2代码快10倍。好,你可能会发现在ActionScirpt 1和ActionScript 2中的许多并不复杂的任务在ActionScript 3.0中的代码长度会是原来的两倍长。但是最终你获得是它的高速和效率。对于那些经常使用代码的用户来说看到了希望,而对于高级的程序员来说将会高兴的跳起来。
下面是一些ActionScript 3中的新特性:
1.运行时排错—错误会运行时抛出以帮助你调试你的影片。
2.运行时变量类型检测—在回放时会检测变量的类型是否合法。
3.类封装—静态定义的类以增强性能。
4.方法封装—方法现在与它们相关的类实例绑定因此在方法中的’this’将不会改变。
5.E4X – 一个新的,更易于操作的xml
6.正规表达式—支持本地化正规表达式。
7.命名空间—不但在xml中支持命名空间而且在类的定义中也同样支持。
8.int和uint数据类型—新的数据变量类型允许ActionScript使用更快的整型数据来进行计算。
9.新的显示列表模式—一个新的,自由度较大的管理屏幕上显示对象的方法。
10.新的事件类型模式—一个新的基于侦听器事件的模式
在哪里输入Flash CS3代码
当你在Flash CS3中使用ActionScript 3.0书写代码时,你可能正在时间线上书写代码。如果你并没有在时间线上书写代码,那么你可以将你的代码书写在外部类文件中(也就是说你不能将代码直接写在fla文件中,现在你使用的是哪种方式呢?),在ActionScript 1和ActionScript 2中,你可以在时间线上写代码,也可以在选中的对象如按钮或是影片剪辑上书写代码,代码加入在on()或是onClipEvent()代码块中以及一些相关的事件如press或是enterFrame.这些在ActionScript 3.0都不在可能了。代码只能被写在时间上,所有的事件如press和enterFrame现在都很同样要写在时间线上。
Adobe flash ActionScript3.0入门
Figure: 试图想在选中的对象上输入代码时出现的提示,不能应用代码。
变量
变量是在代码中描述或是容纳不同值或数据的名称。当你在ActionScript 3.0中声明变量时,你需要使用var关键词。
代码:
var myVariableName; // 需要使用var
从flash5版本开始,var 关键词就已经可用了,但是在现在的ActionScript 3中它是必须的。例外的情况是在定义动态对象实例的变量数据时。
代码:
myDynamicObject.newVar = value; // 不需要var
在上面的例子中,newVar在myDynamicObject对象中新定义的一变量,没有使用var关键词。实际上,var 关键词从来不在复杂引用中应用,或是任意需要点语法的引用中,或是使用[]引用的变量。
当定义一个变量时你必须使用数字,字符,$符号或下划线_来命名变量,你不能使用数字开头的名字来做为变量名称。如”bits32”,”_bits32”和"$bits32"都是合法的,“32bits”是不合法的因为它的名称之前使用了数字。
你需要确认你所创建的变量名没有和你现有的代码中的变量和代码内部预置变量没有冲突。例如,当你在时间线上书写代码时,你正在定义一个影片剪辑的实例名称,如果你试图将其定义成与flash内置的变量MovieClip名称相同,你将会得到一个错误。
代码:
// 任意的时间代码
var name:String = "Joe"; // 错误:与现有的内置变量名称冲突
同样,你不能在全局对象或是函数如Array,XML或是trace中使用。
注意:从Flash Player 7之后,ActionScript 开始区分大小写,因些变量Name和name是不同的。
ActionScript 3.0中还有一个新的地方是你只能在某一代码范围或是时间线代码上使用一次var,从另一个角度说,如你在一段代码的顶端声明了变量x,那么你不能在下面代码中的x变量使用var 关键词。
代码:
var x = value; // ok
…
var x = differentValue; // 错误:你只能使用一次var关键词。
当在Flash的时间线上定义变量时,它会应用在整个时间线上,而不只是当前的帧。
当使用var 关键词定义变量时,你可以为其指定变量类型,一个变量变量类型描述是它将存放的是哪种类型的数据。这个特性是从ActionScript 2.0开始的,一直继续到现在的ActionScript 3.0. 例如,如果你想让变量x是一个数值,那么你可以为它指定一个数值型如下。
代码:
var x:Number; // 变量x将用于承载数值型数据
在两个版本的ActionScript中,书写看上去是自由的,然而ActionScript 3 会在影片回放时保持书写信息的一些检查,不象在ActionScript 2.0中,在编译才会进行错误检查。这意味着你需要对你所使用的类型做出更多的判断,特别是你不能在ActionScript 3中针对一个变量使用两次var 关键词(而在ActionScript 2.0中将允许你针对同一变量使用不同的变量类型).
对于根本没有类型的变量来说,在ActionScript 3.0中你可以为其指定任意类型。它提供了一个特殊的类型”untyped”类型,它描述的是---没有类型。它的呈现方式是(*).
var anyValue:*; // 变量可以是任意的类型
为变量指定类型是个好的习惯,因为它可以引导更好的进行错误检查。在使用untyped类型时,你可以在指定为untyped类型加下一些说明,以便在其它人看代码时不至于去猜测。
如果你没有为一个变理提供一个默认的值,它将被系统默认的根据所设置的类型指定一个数值。如果没有设置变量类型,它将被指定一个undefined做为数值。下面列表中列出了在ActionScript 3.0不同的数据数据类型的默认值。
代码:
var untyped:*; // (or no typing) undefined
var boolean:Boolean; // false
var number:Number; // NaN
var integer:int; // 0
var unsignedInteger:uint; // 0
var string:String; // null
var object:Object; // null
任何对象类型的默认值都是null.需要注意的object类型(任何对象包括arrays 和我们自定义类的对象)的默认值都是null,而不是undefinded。实际上在ActionScript中对象不能是undefined。如果他们没有值,那么他们就是空null。只有类型为untyped的变量或偿试访问的变量不存在时才会得一个undefined值。
Number类型现在有了一个唯一值,而不在是undefined或是null了。如果他们没有值,那么他们的值为NaN(“不是一个数值“)。NaN是一个比较巧妙的值,然而,你不能真正的拿一个NaN与另一个NaN去比较因为他们可能并不一样。如果你需要检查一个数值是否为NaN,你需要使用isNaN语法。
代码:
if (isNaN(myNumber)) //检查myNumber是否已定义.
Int和uint变量类型是ActionScript 3中新增的类型。它们是用来指定描述32位整形或整数的。Int类型是一个标准的整型,uint是一个未标记的整型,或不为负值的整数。这些数值只能是整数值,他们不能为空null,undefined,或是NaN。你可能已经注意到这两种类型的写法为int和uint,他们的第一个字母并没有大写,这意味着他们并不是特定指定给对象或是与类关联的类型,相反,这些类型本质上与Number类型共享(在MIN_VALUE和MAX_VALUE中的应用)
还有另外一个类型也没有首字母大写,这就是void类型,在ActionScript 2.0中它的首字母是大写的,但是在ActionScript 3中它的首字母不在大写了,类似于int和uint,并没有特殊的定义与其相关联。这种类型通常用于指定给函数。
做过Flash动画的Flash爱好者们都知道,要做好一个Flash动画,AS是必不可少的,即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简单的介绍一下AS的基本常识。
首先我们要了解AS要写在什么地方,什么时候AS会被触发执行。
1、帧:
写在关键帧上面的AS,当时间轴上的指针走到这个关键帧的时候,就写在这个帧上面的AS就被触发执行了。常见的例子有在影片结尾的帧写上 stop() 等。操作方法就是点选关键帧,然后打开AS面板。
2、按钮:
不同于帧上面的AS,按钮上面的AS是要有触发条件的。要把AS写在按钮上,操作方法是点选目标按钮,然后打开AS面板。举个例子能说的更明白。
假设有一个动画,要让它在播放完同时停止,那么,你要做的就是在这个动画的最后一帧写AS
stop();
再假设有个按钮,效果是按下按钮后停止播放,那么步骤如下。
做一个按钮,放到主场景,点选按钮,然后打开AS面板。现在如果也在按钮上写
stop();
那么,输出的时候就会提示错误。正确的应该这样写
on(release){
stop();
}
这里要比帧的动画多这些代码: on(release){} , 整个代码翻译过来就是:
当(松开){
停止
}
红色的代码表示鼠标的触发事件事件之一,这里用的是 release 松开,按钮的常用事件:
release 松开
releaseOutside 在按钮外面松开
press 按下
rollOver 鼠标进入按钮的感应区
rollOut 鼠标离开按钮的感应区
现在很明确了:写在按钮上面的AS一定就是这种格式的:
on(事件){要执行的代码}
3、MC(电影剪辑)
如果你看懂了上面的内容,那么写在MC上面的AS和写在按钮上的大同小异。操作方法就是点选MC,然后打开AS面板。看个例子
onClipEvent(load){
stop();
}
同样,MC需要一个事件来触发AS的执行。翻译这段代码就是
当剪辑(载入){
停止
}
红色代码同样表示一个事件。MC的事件有下面这些:
load 载入,当MC出现的时候执行。也就是除非卸载这个MC,否则load事件内的代码只执行一次
unload 卸载,当MC卸载的时候执行
enterFrame 存在的每个帧。在MC存在的每个帧都要执行一次代码。如果你的场景有100个帧,有个MC从41帧开始出现到100帧才消失,那么这个MC上面的代码执行了60次
mouseDown 按下鼠标,在场景内任何地方都算。和按钮不一样的地方
mouseMove 移动鼠标,只要移动鼠标就执行代码
mouseUp 松开鼠标
同样你要明确:写在MC上的代码一定总是这种格式:
onClipEvent(事件){代码}
看到这里,如果你明白的写在 帧、按钮、MC上的代码有什么不一样,任务就算完成了
AS 对象篇
重点 :点语法学会表达对象
学会用绝对路径和相对路径表达对象
虽然AS不是真正的面向对象的编程,但是它也有对象的概念。这个概念贯穿整个AS的始终,所以,对对象的理解,比对语法或者其他的理解更为重要。现在开始吧:
首先,我们来了解一下路径,路径分两种:绝对路径和相对路径。做过html的朋友应该知道这个概念。但这里我还是要详细解释一下,我认为对路径的理解要深入,我初学的时候就是磕在路径上。
在讲路径之前,有必要先讲一下 .语法 : 举例说明,这里要表示房间里的桌子上的一本
书,用 .语法这么表示:
房间.桌子.书
如果要再细到书上的页上面的字,很显然
房间.桌子.书.页面.字
看明白了吧?我也不懂得怎么说, .语法就是这样表示对象的,点的前面是其后面的父级。如房间是桌子的父级,桌子的子级就是书。
注意事项
--------------------------------------------------------------
1、AS3的强制类型转换
目前总结下来有两种写法:
var loader:URLLoader = URLLoader(event.target);
不知道这种写法是借鉴那种编程语言,反正我没有见过。
补充这个语法说明:[url]http://livedocs.adobe.com/flash/8_cn/main/00001211.html[/url]
var loader:URLLoader = event.target as URLLoader;
这种写法是借鉴VB.Net编程语言,唉!AS3语法真得一个大杂烩。
2、URLStream和URLLoader
URLStream在文本文件数据方面可以支持多种字符编码。
URLLoader在进过测试后,发现除UTF-8字符编码外,其他字符编码读过来的数据都是乱码。
可通过ByteArray对象字符编码转换(感谢abc12hjc提供补充代码):
public class MoxieAS extends Sprite
{
public function MoxieAS ()
{
var stream:URLStream = new URLStream;
stream.addEventListener(Event.COMPLETE, complete);
stream.load(new URLRequest("ttt.xml")); //
}
private function complete (event:Event):void
{
var stream:URLStream = event.target as URLStream;
var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable));
trace(xml.*.length()); // output 3
}
}
具体用那个方式就看实际功能需求了。
3、URLRequest
URLStream、URLLoader、Loader等读取外部数据的类,里的load方法参数值是URLRequest对象。我在编程过程总是喜欢直接写地址字符串,原来习惯改过来看样子要花点时间了。
4、Loader
在使用Loader来加载数据时,添加侦听事件时,注意一定要给Loader的 contentLoaderInfo属性增加事件,而不是给Loader对象增加事件。我就是因为加错对象(关键是编译时还没有报错),郁闷得差点要把电脑给扔了。
错误写法:
var loader:Loader = new Loader();
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
正确写法:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
5、Loader加载过来的数据类型
大家知道Loader是用来代替原来 MovieClip的loadMovie功能,用于加载外部的图片文件,SWF文件。
* 如果加载图片文件(jpg,gif,png等)时,Loader.content得到数据类型是Bitmap对象;
* 如果加载SWF文件(flash 9 版本)时,Loader.content得到数据类型是MovieClip对象;
* 如果加载SWF文件(flash 9 以前版本) 时, Loader.content得到数据类型是AVM1Movie对象;
6、stage
在调试flash过程发现,如果把swf文件放到html页面后,stage.stageWidth和stage.stageHeight在第一次加载调用时,他们的值为空值;
7、 AVM1Movie
如果是AVM1Movie 对象时,就不能直接调用stop,play,gotoAndStop等原来MovieClip对象的功能了,而且不能将AVM1Movie 对象转换成MovieClip对象。目前解决办法:一种是用flash cs3 重新生成 flash 9的swf文件;另一种是国外网站有说能AVM1和AVM2两个虚拟机相互调用的方式(贴一个地址);
8、mask
在使用遮罩功能,发现一个问题,如果不把用于遮罩的显示元件通过addChild方法添加到同一级的显示容器里的话,遮罩效果就显示不正常,不知道这个是不是一个bug。