AS3基础教程-第28课-按钮切换画面小程序(下)
本节课的内容续接上节课,请大家讲27.fla文件复制一份,重命名为28.fla,然后用flashCS6打开,本节课仅修改代码,直接按F9键打开动作面板。本节课的目的是将上节课的代码进行精简,会牵扯到两个新的知识点,因为无法对这两个知识点进行归类,故此只能在本节课内给出,请大家仔细阅读并理解之。
工具/原料
flashCS6
一、第一种简写:
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:Arra鲻戟缒男y=[shouye_btn,tupian_btn,ruanjian_btn,guanyu_btn]for(v锾攒揉敫ar 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(e即枢潋雳vt.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使用了一种被称为“文档类”的设计,可以完美的将代码和界面彻底分离。这部分内容将在本系列教程的末尾介绍,敬请期待。