AS3基础教程-第28课-按钮切换画面小程序(下)
1、上节课讲过,4个按钮的单击操作完全类似,可以使用更加简单的手段来书写代码。请大家看一下原代码,4个按钮的单击操作分别放在了4个响应函数内。
这4个响应函数分别名为
fl_MouseClickHandler()
fl_MouseClickHandler_2()
fl_MouseClickHandler_3()
fl_MouseClickHandler_4()
2、我们现在的目的是,使用一个响应函数,实现四种操作。直接给出修改后的全部代码如下:
stop()
shouye_btn.addEventListener(MouseEvent.CLICK, danji);
tupian_btn.addEventListener(MouseEvent.CLICK, danji);
ruanjian_btn.addEventListener(MouseEvent.CLICK, danji);
guanyu_btn.addEventListener(MouseEvent.CLICK, danji);
function danji(event:MouseEvent):void
{
switch(event.target.name){
case "shouye_btn":
gotoAndStop(1)
break
case "tupian_btn":
gotoAndStop(2)
break
case "ruanjian_btn":
gotoAndStop(3)
break
case "guanyu_btn":
gotoAndStop(4)
break
}
}
3、如下图所示,使用一个switch分支判断,就可以将 原本是 4块的 响应函数,用一个响应函数实现。
充当switch判断的条件是event.target.name
这是本节课的第一个知识点:
event就是响应函数的参数,参数是啥,这里就必须是啥
event.target的意思是 当前被单击的对象
event.target.name的意思是 当前被单击对象的 实例名,乃是String类型的变量,故此,后面的case分支紧跟的都必须用引号给引起来

1、我们发现,上面的代码仍显麻烦,其实,还有更加简易的写法。
我们将上面刚改完的28.fla文件再复制一份,重命名为28_pro.fla,然后打开该文件,继续修改
2、这一次,我们会将代码写的很抽象,好处是,代码很简洁,且明白了原理后,阅读起来会感觉思路也清晰。我先给出完整的代码
3、stop()
var names:Array=[shouye_btn,tupian_btn,ruanjian_btn,guanyu_btn]
for(var i:uint=0;i<4;i++){
names[i].addEventListener(MouseEvent.CLICK,danji);
}
function danji(evt:MouseEvent):void
{
gotoAndStop(names.indexOf(evt.target)+1)
}

4、现在将代码分段进行说明:
var names:Array=[shouye_btn,tupian_btn,ruanjian_btn,guanyu_btn]
定义一个 数组,存储的是4个按钮的实例名,而且是按照舞台上4个按钮的顺序存放在数组内部的。注意一个细节:数组内的元素,都没有带引号。说明,数组内的所有的元素代表的都是舞台上的对象,并不是对象的实例名。
5、for(var i:uint=0;i<4;i++){
names[i].addEventListener(MouseEvent.CLICK,danji);
}
使用一个for循环,由前面章节我给大家总结的公式:
for(A;B;C){
D
}
可知,A和B的共同作用,就是限定了这个循环的次数是4次。每一次循环只给一个按钮添加单击命令。4次循环完毕后,舞台上的4个按钮都添加了同一个相应函数为danji()的单击按钮命令
6、function danji(evt:MouseEvent):void{
gotoAndStop(names.indexOf(evt.target)+1)
}
书写相应函数的内容。
<1>注意,本例中,我将响应函数的参数设置为了evt
这个是任意设置的,但需保证凡是用到该参数的地方,都保持一致。
<2>evt.target的返回值就是当前被单击的对象,由于后面没有紧跟.name,故此,这里不是返回被单击对象的实例名哦
<3>使用了数组的indexOf(元素)方法,该方法的返回值是 元素 在数组内的索引值。因为数组的索引值都是从0开始的,但是我们时间轴是从1开始的,所以,需要在names.indexOf(evt.target)后面+1才可以跳转到相应的帧
1、本节课的两个代码方案,对应的界面一模一样,仅仅是修改了代码而已。
但是,受限于下面的设计:
代码直接写在了fla文件的时间轴上
导致了,每修改为一段新的代码,就必须将fla文件复制一份,然后再重新修改代码
2、因为本例的界面超级简单,即使是将fla复制多份,也不会影响到什么。
但是,如果某个作品的界面超级复杂,fla文件内嵌了很多图片和声音,导致了fla文件的体积也很大。
再按照本文的手法来操作的话,将会浪费很多硬盘空间。
3、所以,将代码和界面完全分离,就成了一个亟待解决的问题。
令人欣慰的是,AS3从本质上就支持这个效果。
4、AS3使用了一种被称为“文档类”的设计,可以完美的将代码和界面彻底分离。这部分内容将在本系列教程的末尾介绍,敬请期待。
