zoukankan      html  css  js  c++  java
  • Cocos2d JS 之消灭星星(八) 处理星星类之——消灭星星

      1 /*
      2  * 本层拥有处理星星的实例化以及对星星的操作
      3  * 1/排列星星
      4  * 2/移动和删除星星
      5  */
      6 var GameStarLayout = ccui.Layout.extend(
      7 {
      8     size:null,
      9     starArr:[],//存放点击与被点击状态的星星资源
     10     starObjArr:[],//存放游戏中星星的二位数组
     11     firstTouchStar:null,//第一次选择的星星,用于判断两次选择的星星颜色是否一致
     12     isSelected:false,//是否选择星星,如果已选择则再次点击将星星消灭
     13     starList:[],//相连同色星星列表
     14     ctor:function()
     15     {
     16         this._super();
     17         this.zinit();
     18         this.layoutStar();
     19     },
     20     //将星星按10*10的矩阵排列出来
     21     layoutStar:function()
     22     {
     23         for(var i = 0; i < 10; i++)
     24         {
     25             for(var j = 0; j < 10; j++)    
     26             {
     27                 //随机从5种不同颜色的星星中选择一个
     28                 var randomNumber = Math.floor(Math.random()*this.starArr.length);
     29                 var starResource = this.starArr[randomNumber];
     30                 var star = new GameCreateStar(starResource.normal, starResource.id,starResource.selected, i, j);
     31                 this.addChild(star, 0);
     32                 //星星出现的动画
     33                 var moveTo = cc.moveTo(i/10, cc.p(star.width*i, star.height*j));
     34                 star.runAction(moveTo);
     35                 //将星星装到数组中
     36                 this.starObjArr[i][j] = star;
     37                 //给每一个星星注册侦听器
     38                 star.addTouchEventListener(this.onTouchStarFunc, this);
     39             }
     40         }
     41     },
     42     //星星触摸侦听函数
     43     onTouchStarFunc:function(target, state)
     44     {
     45         if(state == ccui.Widget.TOUCH_ENDED)    //松开
     46         {
     47             if(!this.firstTouchStar)    //如果第一次选择的星星为空,则将当前星星赋给它
     48             {
     49                 this.firstTouchStar = target;
     50                 this.findSameColorStar(target);
     51             }
     52             else 
     53             {
     54                 if(this.starList.length <1){return;} //确保相连同色星星列表不为空,代码才会向下执行
     55                 if(this.starList[0].count != target.count) //第二次点击的不是上一次选择的星星
     56                 {
     57                     //将列表中的星星type还原
     58                     this.setStarListItemToNomal(this.starList);
     59                     this.findSameColorStar(target);
     60                 }
     61                 else    //第二次点击相连同色星星列表中的星星
     62                 {
     63                     this.firstTouchStar = null;
     64                     this.removeSameColorStar();
     65                 }
     66             }
     67         }
     68     },
     69     //消灭相连在一起的同色星星
     70     removeSameColorStar:function()
     71     {
     72         for(var i = 0; i < this.starList.length; i++)
     73         {
     74             //this.starObjArr是二维数组
     75             for(var j = 0; j < this.starObjArr.length; j++)
     76             {
     77                 for(var k = 0; k < this.starObjArr.length; k++)
     78                 {
     79                     if(this.starObjArr[j][k].col == this.starList[i].col && this.starObjArr[j][k].row == this.starList[i].row)
     80                     {
     81                         this.starObjArr[j][k].removeFromParent();
     82                     }
     83                 }
     84             }
     85         }
     86         this.starList.splice(0);
     87     },
     88     //寻找相连在一起同色的星星
     89     findSameColorStar:function(target)
     90     {
     91         //相连同色星星列表
     92         this.starList.splice(0);    //将列表清空
     93         this.starList = this.getSameColorStar(target.col, target.row, target.type);
     94         //将满足条件的相连同色星星设为选中状态,玩家能对消除星星数量一幕了然
     95         this.showCurrentSameStarSelectedState(this.starList);
     96     },
     97     //如果两次选择的不是同种颜色的星星,则将之前选择的星星设为初始状态
     98     setStarListItemToNomal:function(starList)
     99     {
    100         for(var i = 0; i < starList.length; i++)
    101         {
    102             //还原列表中星星的初始type值
    103             starList[i].type = starList[i].normalType;
    104             starList[i].isSelected = false;
    105             starList[i].updateTexture();
    106             starList[i].count = 0;
    107         }
    108     },
    109     //将满足条件的相连同色星星设为选中状态
    110     showCurrentSameStarSelectedState:function(starList)
    111     {
    112         for(var i = 0; i < starList.length; i++)
    113         {
    114             starList[i].isSelected = true;
    115             starList[i].updateTexture();
    116             starList[i].count++;
    117         }
    118     },
    119     //获得相连同色星星列表
    120     getSameColorStar:function(col, row, type)
    121     {
    122         var starList = [];
    123         //星星必须在矩阵范围内(9X9)
    124         if(this.jugementStarPostion(col, row) == -1)
    125         {
    126             return starList;    
    127         }
    128         if(this.starObjArr[col][row].type == type)
    129         {
    130             starList.push(this.starObjArr[col][row]);
    131             this.starObjArr[col][row].type = -1;
    132             //递归调用,寻找当前星星四周的同色星星
    133             starList = starList.concat(this.getSameColorStar(col+1, row, type));//右边
    134             starList = starList.concat(this.getSameColorStar(col - 1, row, type));//左边
    135             starList = starList.concat(this.getSameColorStar(col, row + 1, type));//上方
    136             starList = starList.concat(this.getSameColorStar(col, row - 1, type));//下方
    137         }
    138         return starList;
    139     },
    140     //判断col,row值是否在矩阵范围内,
    141     jugementStarPostion:function(col, row)
    142     {
    143         if(col < 0 ||col >9)    //超出水平范围
    144         {
    145             return -1;
    146         }
    147         if(row < 0 || row > 9) //超出垂直范围
    148         {
    149             return -1;
    150         }
    151         if(this.starObjArr[col][row] == null || this.starObjArr[col][row] == undefined)    //该对象不存在
    152         {
    153             return -1;
    154         }
    155         return this.starObjArr[col][row].type;
    156     },
    157     //初始化
    158     zinit:function()
    159     {
    160         this.size = cc.size(480, 500);
    161         //设置层的大小
    162         this.setSize(this.size);
    163         //将星星资源存放到数字中
    164         this.starArr = [
    165                         {id:1, normal:res.star1, selected:res.star1s},
    166                         {id:2, normal:res.star2, selected:res.star2s},
    167                         {id:3, normal:res.star3, selected:res.star3s},
    168                         {id:4, normal:res.star4, selected:res.star4s},
    169                         {id:5, normal:res.star5, selected:res.star5s}
    170                         ];
    171         for(var i = 0; i < 10; i++)
    172         {
    173             this.starObjArr.push([]);
    174         }
    175     }
    176 });
    177 //实例化
    178 GameStarLayout.createLayout = function()
    179 {
    180     var starLayout = new GameStarLayout();
    181     return starLayout;
    182 };
    /***************************effect image****************************/
    
    
  • 相关阅读:
    JavaScript设计模式 Item 6 --单例模式Singleton
    把上个JDBC Request查询出来的结果当成下个JDBC Request查询的参数
    Jmeter连接数据库
    Jmeter 消息体使用csv参数化时编码问题
    在fiddler中设置断点修改数据(二)
    在fiddler中设置断点修改数据(一)
    抓包工具fiddler的安装与配置
    解决配置fiddler时信任证书报:Unable to configure Windows to Trust the Fiddler Root certificate.The LOG tab may contain more infor
    截图贴图神器Snipaste
    Jmeter 字符串拼接参数
  • 原文地址:https://www.cnblogs.com/zfsSuperDream/p/4065311.html
Copyright © 2011-2022 走看看