章标题:PART 01 Basic
1-5 ActionScript 3.0 基本练习
【P19】1.MovieClip对象或Sprite对象.buttonMode=true//激活两类对象的按钮模式
默认情况下,MovieClip对象或Sprite对象在被单击的时候不会出现按钮的手势指针,需将其buttonMode属性设为true才会出现按钮的手势指针。该属性被定义在Sprite类里。
【P19】2.在AS3中,与鼠标单击的相关事件有3种:
<1>MouseEvent.CLICK
在实例对象上按下并松开鼠标,这两个动作都有才会发生此事件
<2>MouseEvent.MOUSE_DOWN
在实例对象上按下鼠标就会发生此事件。类似于AS2的onPress事件。
<3>MouseEvent.MOUSE_UP
在实例对象上松开鼠标就会发生此事件。即使在画面空白处按下鼠标、再滑入对象的感应区后松开鼠标,一样会发生该事件。类似于AS2的onRelease事件。
【P20】3.
this.buttonMode = true;//this指的是自己,亦即clip_mc对象
this.addEventListener(MouseEvent.CLICK,onClick);
function onClick(e:MouseEvent):void {
MovieClip(parent).gotoAndPlay(2);
}
此处如果直接写parent.gotoAndPlay(2);会有编译器错误。原因是:parent属性回传的类是DisplayObjectContainer,而该类并没有gotoAndPlay()方法,所以要多一个类型转换的语句。而parent指的是上一层,本处的上一层就是swf文件的主时间轴,我们使用类名称加上小括号的方式来将之转换为MovieClip类的对象,再使用gotoAndPlay()方法就不会产生错误。也可以写成(parent as MovieClip).gotoAndPlay(2);
【P20】4.在AS2中使用_parent属性指的是回传上一层的显示对象容器,其类型为MovieClip,故可直接写为_parent.gotoAndPlay(2);不会有问题。
AS3的类是很重要的,一定要转回该类才能使用该类的属性和方法。那么是不是可以任意的转换类呢?答案是否定的。可用1-3节的电玩游戏转职表来分析:
虽说所有的英雄都是剑士,也可说所有的英雄都是人类,但并非所有的人类都是英雄。对照回AS3的类,就是:所有的MovieClip都可以是DisplayObjectContainer类,但DisplayObjectContainer类就不一定是MovieClip类了。也就是说,类可以向上转型但不能向下转型。
【P21】5.让一个侦听器函数同时侦听多个发送者
发送者(事件源)在发出事件时,除了发送事件类型之外,还会一起发送相关参数。AS3的这种相关参数就是由Event类来处理的,故侦听器函数定有一Event(或其子类)的对应参数来接收。
通过“参数.currentTarget”可以取得发送者对象;“参数.currentTarget.name”可得到实例名
【P21】6.从库中把元件放置到场景中
AS2时代使用attachMovie()方法,在AS3中该方法已被停用,取而代之的是先实例化自定义类,再用addChild()方法将其加入指定显示对象容器内从而呈现在舞台上,做法如下:
<1>先做好影片剪辑,然后打开库面板,在“AS链接”那里直接输入ItemMC【只有flashCS5以后的版本才可以如此输入,老版本的需要按照电子书中的方式操作】这个ItemMC就是所谓的“自定义类”
<2>主时间轴第一帧写代码如下:
var item:MovieClip=new ItemMC();/*该行可修改为var item:ItemMC=new ItemMC()但推荐不要修改,原代码交代清楚了自定义的类是继承于MovieClip类的*/
item.x=item.y=50;
this.addChild(item);//AS3内必须使用addChild()方法才可以看到对象
【P23】7.在AS2中,Stage类并不是容器对象,主时间轴就是整个容器的最上层。
但是AS3中,最上一层的容器一定是Stage类,且它只有一个,也无法被实例化,接着是MainTimeLine主时间轴
【P24】8.事件流简介
AS2中,上层容器对象被赋予onRelease等事件时,其容器里的鼠标事件就会被覆盖掉。
但是AS3中由于事件流的关系,导致事件可以不停的由上往下传递,直至所单击的目标对象,再往上回传至Stage,这整个过程就是事件流。以代码为例:
<1>按照【P21】6的<1>内的手段设计好影片剪辑在库内的AS链接为ItemMC
<2>主时间轴第一帧写代码如下:
var contatiner:Sprite=new Sprite();
container.x=20;
container.y=60;
container.name="contatiner";//自定义显示对象的实例名,若不自定义,会被flash按照层级关系命名为“instance+数字”
container.addEventListener(MouseEvent.CLICK,onClick);
this.addChild(container);
for(var i:uint;i<5;i++){
var item:MovieClip=new ItemMC();
item.x=120*i;
item.y=10;
item.buttonMode=true;
item.name="item"+i;
container.addChild(item);
}
function onClick(e:MouseEvent):void{
trace("发送者对象:"+e.currentTarget.name);
trace("目标对象:"+e.target.name);
}
测试影片发现,单击舞台上的对象时,可在输出面板看到:无论点击的是哪一个对象,发送者都是container,因为我们是对该container对象注册的侦听。而,目标对象则会随着被点击的对象的不同而有所不同。明明对象是被包在了container里,且我们也没有对这些对象注册侦听,却依然可以捕捉到被单击的目标对象。
这是因为,当MouseEvent.CLICK事件发生时,事件都是由Stage往下传送,直至到达目标对象之后,才再往回传至Stage,因此能轻易地捕捉到目前被单击的目标对象时哪一个。
其中,侦听器函数的参数e的currentTarget指的一定是发送者对象(本例中的container对象),而target属性则可以捕捉到目前所单击的目标对象。
【P27】9.超链接语法
AS2要链接到网址时,仅需使用全局函数getURL("网址")即可。但AS3中被倾力修改了,使用的是Flash.net包内的navigateToURL()函数,且该函数需要使用URLRequest类来处理。
stage.addEventListener(MouseEvent.CLICK,gotoLink);
function gotoLink(e:MouseEvent)
{
var url:String = "http://www.baidu.com";
var req:URLRequest = new URLRequest(url);
navigateToURL(req,"_blank");/*"_blank"表示在新建窗口内打开链接,仅swf内嵌入网页时,该代码才有效。如果只是单纯的发布为swf文件,"_blank"可以省略不写*/
}
上述代码可简写为:
stage.addEventListener(MouseEvent.CLICK,gotoLink);
function gotoLink(e:MouseEvent)
{
navigateToURL(new URLRequest("http://www.baidu.com"),"_blank");
}
【P28】10.加载外部图像
AS2时代加载图像或SWF文件都是由MovieClip来执行,但AS3内MovieClip类已经不能加载任何东西,取而代之的是Loader类。又因Loader类继承自显示对象DisplayObject,故可被加至显示对象容器里。
var ldroader=new Loader();
var req:URLRequest = new URLRequest("demo.jpg");//需要在fla文件所在目录内有一个名为demo.jpg的图像文件,否则会报错。
ldr.load(req);
addChild(ldr);
【P29】11.载入外部SWF文件
加载外部swf文件的语法和加载图片文件的语法一样,但加载后,Loader对象里的构架会不太一样。详见电子书内的陈述。
【P30】12.加载SWF文件时的root属性值
假设以main.swf去加载相同目录下的child.swf文件。AS2中,不论是main.swf还是child.swf里指定_root属性,都一定指向最上层的时间轴,也就是main.swf里的最上层
但在AS3中,root属性(注意没有下划线)一定是指向该SWF本身的最上一层时间轴。因此在main.swf里使用root属性的话,会指到自己的最上层时间轴;在child.swf使用root属性也是指到child.swf自己的最上层时间轴、并不会指到main.swf中去。
因此,AS2时代,如果需要屏蔽被加载的swf文件的_root指向自身,需要做如下设置:
在child.swf文件内主时间轴加上如下一行代码
this._lockroot=true;
那么,child.swf文件内指定的_root属性都是child.swf文件的最上层,不会指到main.swf文件内
【P31】13.侦听外部加载的进度,并确认是否加载完成
AS3的Loader类有一个contentLoaderInfo属性,可传回正在加载对象的LoaderInfo对象。而LoaderInfo类会提供有关加载的SWF文件或图像文件的信息。简而言之,Loader只负责加载,而LoaderInfo则负责提供加载进度等相关的信息。
var ldroader=new Loader();
ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoaderProgress);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderComplete);
var req:URLRequest = new URLRequest("E:/swf/1.swf");//请将路径修改为合适自己电脑情况的
ldr.load(req);
addChild(ldr);
var tf:TextField=new TextField();//新建一个动态文本,用于显示加载进度的
tf.x=40;
tf.y=380;
tf.width=200;
addChild(tf);
function onLoaderProgress(erogressEvent)
{
var _percentage:uint = e.bytesLoaded / e.bytesTotal * 100;
tf.text="载入百分比:"+_percentage+"%";
}
function onLoaderComplete(e:Event)
{
ldr.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,onLoaderProgress);
tf.text="加载完成!"
}
测试时,开启“视图 模拟下载”或者测试影片之后继续按一次快捷键Ctrl+Enter即可开启模拟下载的情况
【P32】14.控制外部加载的SWF文件
载入外部的SWF文件之后,可以控制其播放或调用其内部函数来执行,不过,上述操作都必须要在SWF文件完全加载成功后,才可以实现
打开“fla源文件”文件夹内的13_Loader_SWFAndGotoAndPlay.fla文件
var ldroader = new Loader();
ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoaderProgress);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderComplete);
var req:URLRequest = new URLRequest("loadedAS3.swf");
ldr.load(req);
this.addChild(ldr);
function onLoaderProgress(erogressEvent):void {
var _percentage:int = e.bytesLoaded / e.bytesTotal * 100;
trace("载入百分比:"+_percentage);
}
function onLoaderComplete(e:Event):void {
var _contentMC:MovieClip = ldr.content as MovieClip;
_contentMC.gotoAndPlay(2);
}
注:Loader对象的content属性可以取得其容器内的显示对象,该属性回传的类是DisplayObject。由于被加载的loadedAS3.swf文件是使用AS3编写的,所以对象是MovieClip,一样需将类传回MovieClip才能进一步操作它【使用as可以将对象更改类型】
同理,如果被加载的是图像,那么content属性取得的会是Bitmap对象
【P33】15.侦听主时间轴的加载进度
每个显示对象实例都有loaderInfo属性,利用该属性可以取得相关的加载信息,当然包括主时间轴。打开“fla源文件”文件夹内的14_loadMainSWF.fla文件,代码如下:
stop();//先让时间轴暂停。
this.addEventListener(Event.ENTER_FRAME, onRootEnterFrame);//侦听ENTER_FRAME事件。
function onRootEnterFrame(e:Event):void {
var _bytesLoaded:int = this.loaderInfo.bytesLoaded;//已载入元位组。
var _bytesTotal:int = this.loaderInfo.bytesTotal;//总档案大小元位组。
var _percentage:int = (_bytesLoaded / _bytesTotal * 100);//二者相除并乘上一百, 即可得到百分比。
if (_percentage >= 100) {//如果载入的百分比大于等于100, 表示载入完毕。
this.removeEventListener(Event.ENTER_FRAME, onRootEnterFrame);//取消侦听。
this.play();//播放时间轴。
} else {
percent_txt.text = "LOADING" + _percentage +"%";
}
}
您所在的用户组只能看到部分内容.
如查看全部内容, 请先
登录或者
注册.