变死为活——封装代码转为函数 在“贪吃蛇”教程中,有这样一个功能代码块: const w:uint=26;//表示把界面分为26列 const h:uint=20;//表示把界面分为20行 var grid:Vector.
切除冗余——只对可能部分检测 在“美女拼图”游戏中,对于是否过关的检测,最初的方法是这样的设计: 玩家每移动一个图块,就遍历所有图块是否到达正确位置: function isWin() { var all:uint =0; for (var n:uint=0;n
构造循环——同类代码巧妙合并 有这样一道练习题: 在舞台上有两列元件:第一列是20个按钮(由mc充当,有按下和抬起两个状态),命名是:mc01_btn、mc02_btn、……、mc20_btn。 第二列是20个影片剪辑,与按钮一一对应。剪辑命名:mc01,mc02、……、mc20。 要实现的效果是鼠标进入按钮,对应的影片剪辑显示,鼠标滑开按钮,对应的影片剪辑隐藏。 一位学员的代码如下: //…………初始状态隐藏20个剪辑…………………… mc01.visible=false; mc02.visible=false; mc03.visible=false; …… mc20.visible=false; //…………为每一个按钮添加侦听……………………… mc01_btn.addEventListener(MouseEvent.ROLL_OVER, mc01See); function mc01See(e:Event):void { mc01.visible=true; } mc01_btn.addEventListener(MouseEvent.ROLL_OUT, mc01Unsee); function mc01Unsee(e:Event):void { mc01.visible=false; } mc02_btn.addEventListener(MouseEvent.ROLL_OVER, mc02See); function mc02See(e:Event):void { mc02.visible=true; } mc02_btn.addEventListener(MouseEvent.ROLL_OUT, mc02Unsee); function mc02Unsee(e:Event):void { mc02.visible=false; } mc03_btn.addEventListener(MouseEvent.ROLL_OVER, mc03See); function mc03See(e:Event):void { mc03.visible=true; } mc03_btn.addEventListener(MouseEvent.ROLL_OUT, mc03Unsee); function mc03Unsee(e:Event):void { mc03.visible=false; } …… mc20_btn.addEventListener(MouseEvent.ROLL_OVER, mc20See); function mc20See(e:Event):void { mc20.visible=true; } mc20_btn.addEventListener(MouseEvent.ROLL_OUT, mc20Unsee); function mc2Unsee(e:Event):void { mc20.visible=false; } 中间的代码被我省略了,没有录下来,但你可以想像得出一共有多少行代码!! 只要我们分析一下这些代码,就会发现它们结构相同、功能相同,只是元件的名字不同而已!于是,我们可以借助数组贮存对象(也可以用getChildByName方法,先构造字符串,再获取字符串所代表的对象,再压入数组),借助循环来构造侦听器。 修改以优化(以下是两种方法): //………定义两个数组,分别存放按钮和剪辑…………………… var mc=[mc1,mc2,mc3,mc4,mc5,mc6,mc7,mc8,mc9,mc10, mc11,mc12,mc13,mc14,mc15,mc16,mc17,mc18,mc19,mc20]; varbtn=[mc1_btn,mc2_btn,mc3_btn,mc4_btn,mc5_btn,mc6_btn,mc7_btn,mc8_btn,mc9_btn,mc10_btn,mc11_btn,mc12_btn,mc13_btn,mc14_btn,mc15_btn,mc16_btn,mc17_btn,mc18_btn,mc19_btn,mc20_btn] 但是,上面的方法我们并不采用,因为还可以进一步优化: var mc=[]; var btn=[]; //………全局变量,方便书写、传值和调用……………………… var obj:Object //………用循环隐藏20个剪辑、构造40个侦听器…………………… for ( var i:uint=1; i<21; i++) { var _mc:Object=getChildByName('mc'+i);//或者:var _mc =root['mc'+i]更简洁 _mc.visible=false;//剪辑初始为隐藏 mc[i] =_mc var _btn:Object=getChildByName('mc'+ i +”_btn”); btn [i] =_ btn _btn.id=i//自定义属性,标识它是几号按钮 _btn.addEventListener(MouseEvent.ROLL_OVER, carSee);//添加侦听,鼠标移入 _btn.addEventListener(MouseEvent.ROLL_OUT, carUnsee); //添加侦听,鼠标移出 } functioncarSee(e:Event):void { obj=mc[e.target.id]//获取自定义属性,目的是点击了几号按钮,就获取几号剪辑 obj.visible=true;//显示它 } functioncarUnsee(e:Event):void { obj.visible=false;//隐藏它 } 如此一来,代码变得极为简洁。
化繁为简——降解复杂简单叠加 制作“连连看”游戏,核心代码就是寻路。但用A星寻路就是小题大做,牛刀杀鸡。通过细心研究,我们可以发现,两张牌的位置关系不外乎: 在一条线上:邻(可连)与望(可连)与隔(无通路的望,不可连) 在两条线上:拐(可连)与断(无通过的拐,不可连) 在三条线上:折(可连)与死(无通路的折,绝不可连) 但是在两条线上(动态考察一个拐点,将拐降解为两条单独的直线)和在三条线上(动态考察两个拐点,将折降解为三条单独的直线),都可以归结在几条条线上。于是相当繁杂的代码,就由两个基础函数来担当,并同此构造出其它二级函数、三级函数: //…….基础函数……..linex....x方向................... function linex(fx:uint,tx:uint,y:uint):Boolean {//横链 vara:uint=fx
绝对原创,和盘奉献!
作者:张志晨