多语言展示
当前在线:773今日阅读:19今日分享:20

怎样优化as3代码

步骤/方法
1

变死为活——封装代码转为函数  在“贪吃蛇”教程中,有这样一个功能代码块:  const w:uint=26;//表示把界面分为26列  const h:uint=20;//表示把界面分为20行  var grid:Vector.=new Vector.(w*h);// Vector数组,用于模拟网格  // 0=路,1=食物,2=蛇身,3=界  var n:int=0;  for (var i:uint=0; i=new Vector.(w*h);// Vector数组,用于模拟网格  function setGrid() {//封装函数  //约定:0=路,1=食物,2=蛇身,3=界  var n:int=0;  for (var i:uint=0;i

2

切除冗余——只对可能部分检测  在“美女拼图”游戏中,对于是否过关的检测,最初的方法是这样的设计:  玩家每移动一个图块,就遍历所有图块是否到达正确位置:    function isWin() {  var all:uint =0;  for (var n:uint=0;n

3

构造循环——同类代码巧妙合并  有这样一道练习题:  在舞台上有两列元件:第一列是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;//隐藏它  }  如此一来,代码变得极为简洁。

4

化繁为简——降解复杂简单叠加  制作“连连看”游戏,核心代码就是寻路。但用A星寻路就是小题大做,牛刀杀鸡。通过细心研究,我们可以发现,两张牌的位置关系不外乎:  在一条线上:邻(可连)与望(可连)与隔(无通路的望,不可连)  在两条线上:拐(可连)与断(无通过的拐,不可连)  在三条线上:折(可连)与死(无通路的折,绝不可连)  但是在两条线上(动态考察一个拐点,将拐降解为两条单独的直线)和在三条线上(动态考察两个拐点,将折降解为三条单独的直线),都可以归结在几条条线上。于是相当繁杂的代码,就由两个基础函数来担当,并同此构造出其它二级函数、三级函数:  //…….基础函数……..linex....x方向...................  function linex(fx:uint,tx:uint,y:uint):Boolean {//横链  vara:uint=fxtx?fx:tx;  for (var j:uint =a+1;j0) {//扫描两点之间,看是否可连,只要有一处不通………优化  returnfalse;  }  }  return true;  }  //…..基础函数…….liney....y方向...................  function liney(fy:uint,ty:uint,x:uint) {//竖链  vara:uint=fyty?fy:ty;  for (var j:uint =a+1;j0) {//扫描两点之间,看是否可连,只要有一处不通………优化  returnfalse;  }  }  return true;  }    于是是否为“邻”、为“望”、为“隔”,就可以这样判断:  //…….二级函数…..line....直.........调用上面的函数,形成新的函数......  function line(go:LirAiGrid,to:LirAiGrid):Boolean {//直链  if (go.y==to.y) {  returnlinex(go.x,to.x,to.y);//调用上面的函数…………  } else if (go.x==to.x){  returnliney(go.y,to.y,to.x); //调用上面的函数……  }  return false;  }  如果不能直连,再尝试从“拐”的角度来判断(调用上面的line(),因为将拐降解为两个直连):  //....angle...拐.................  function angle(go:LirAiGrid,to:LirAiGrid):Boolean {  if(go.x==to.x||go.y==to.y) {//同行或同列不属于“角链”  returnfalse;//似乎没用?不!可以防止“隔”的存在  }  varC:LirAiGrid=web.grid(go.x,to.y);  if (C.value!=0) {//拐点不为空,不可能成链…此为一优化……  returnfalse;  }  if(line(go,C)&&line(C,to)) {//………在此调用…line………  return true;  }  C=web.grid(to.x,go.y);//另一个拐点  if (C.value!=0) {//………此为一优化……………………  returnfalse;  }  if(line(go,C)&&line(C,to)) {//……在此调用…line…………  return true;  }  return false;  }  如果还不能连,就做最后的判断——三折线。如果还不能连,就是“死”。  //...polyline...折链....C形...U形..Z形... N形...均有正反两个方向……  function polyline(go:LirAiGrid,to:LirAiGrid):Boolean {  if (go.x==to.x) {//C形  if(polylinex(go,to)) {//调用下面的三级函数  returntrue;  }  } else if (go.y==to.y){//U形  if(polyliney(go,to)) {  returntrue;  }  } else {  if(polylinex(go,to)) { //Z形  returntrue;  }  if(polyliney(go,to)) {// N形  returntrue;  }  }  return false;  }  //………三级函数………将折降解为三个直线……………………  function polylinex(go:LirAiGrid,to:LirAiGrid):Boolean {  //竖线水平移动:动点变化的是列坐标cx  for (var j:uint =0;j

注意事项
1

绝对原创,和盘奉献!

2

作者:张志晨

推荐信息