1.创建一个二维数组, 将数组里放入一个一到五的随机数并且利用图片命名中的一到五安置进去
this.cellArr = [];
//创建二维数组
for( var k = 0 ; k < DATA.SIZI_W ; k++){
this.cellArr[k]=[]
}
//将二维数组划分成8*8的一个矩阵并且放入一个40*40的位置
for(var i = 0 ; i< DATA.SIZI_W ; i ++){
for(var j = 0 ; j < DATA.SIZI_H ; j++){
var sp = new Cell();
sp.setPosition( 50 + i*40 ,cc.winSize.height-40 - j*40);
sp.setArrIndex(i,j);
this.addChild(sp);
this.cellArr[i][j] = sp
}
}
2.写一个方法体,将传进来的数据的坐标进行一个检查四周的块儿然后将四周的块儿再返回回来,并且在将返回回来的块儿在进行这个检查,并且遍历到所有的块儿。
checkNewArr:function(event){
//将传过来的点击图片的属性赋予给touchIndex
var touchIndex = event.getUserData();
//将touchIndex的值传入checkNeihbor这个方法体内并将结果数组赋予arr
var arr = this.checkNeighbor(touchIndex);
//使用for循环将这个过程循环五次向外查询
for(var i = 0 ; i < 5 ; i++) {
//将newArr数组和arr进行深复制
var newArr = arr.slice();
//进行for循环将index也就是arr数组里的每个元素都赋予给po
for (var index in arr) {
//将每一个元素的坐标都赋予po
var po = arr[index];
//将每一个元素进行checkNeighbor方法体并将结果放入newArr数组
//newArr = newArr.concat(this.checkNeighbor(po))
var newArr = this.filterDelSame(newArr, this.checkNeighbor(po))
}
arr = newArr
//var Lech = newArr.length;
//if (Lech >= 3) {
//
//}
}
this.cellFallDown(arr);
},
2.1检查四周的块儿
checkNeighbor:function(touchIndex){
var checkArr = [cc.p(-1,0),cc.p(1,0),cc.p(0,-1),cc.p(0,1)]
var arr = []
for(var index in checkArr){
var arrayIndex = checkArr[index]
var tempPo = cc.pAdd(touchIndex, arrayIndex);
if(this.checkCellColor(tempPo, touchIndex)){
arr.push(tempPo)
}
}
return arr;
},
2.2检查这个数值的四周的块儿是否超出限制边长
checkCellColor:function(po,touchIndex){
if(po.x < 0 || po.y<0|| po.x > DATA.SIZI_W - 1 || po.y>DATA.SIZI_H - 1){
return false
}
if(this.cellArr[po.x][po.y] == null || this.cellArr[touchIndex.x][touchIndex.y] == null) return false;
return this.cellArr[po.x][po.y].type == this.cellArr[touchIndex.x][touchIndex.y].type
},
2.3将主函数体放回的数值进行移除并且让上面的块儿检测下面的块儿移除数量并且位移移除数量乘碎片宽度的距离
cellFallDown:function(arrayIndexArr){
//清除同颜色的块儿 并且二维数组中的位置置为null
for(var index in arrayIndexArr){
//将传入数组中的每一个元素赋值给arrayIndex
var arrayIndex = arrayIndexArr[index];
//删除掉选择数组中的块儿
this.cellArr[arrayIndex.x][arrayIndex.y].removeFromParent(true);
//将选择的块儿数值变为null
this.cellArr[arrayIndex.x][arrayIndex.y] = null
}
//遍历数组
for(var i = 0;i<DATA.SIZI_W; i++){
for(var j = DATA.SIZI_H - 1;j >= 0;j--){
if(this.cellArr[i][j] == null) {
continue
}
//设置一个值记录消除的块儿并且用于位移使用计算距离
var tempAdd = 0;
for(var k = j;k<DATA.SIZI_H;k++){
if(this.cellArr[i][k] == null) tempAdd++
}
this.cellArr[i][j].fallDownNum = tempAdd
}
}
for(var i = 0;i<DATA.SIZI_W; i++){
for(var j = DATA.SIZI_H - 1;j >= 0;j--){
this.updateCellByFallDownNum(this.cellArr[i][j])
}
}
},
updateCellByFallDownNum:function(cell){
if(cell == null) return;
if(cell.fallDownNum == 0) return;
var tempPo = cc.pAdd(cc.p(0,cell.fallDownNum), cell.primary);
this.cellArr[tempPo.x][tempPo.y] = cell;
this.cellArr[cell.primary.x][cell.primary.y] = null;
cell.fallDown();
cell.fallDownNum = 0
}
2.4因为存在一个反复查询同一个块儿的问题,所以需要检测是否出现同一个已经检测过的块儿,检测办法很多,现在使用的办法是检测是否有重复的元素,检测前先检测数组是否有相同元素,可以做到减少大量重复运算
filterDelSame:function(arr1,arr2){
var returnArr = arr1.concat(arr2);
for(var i = 0 ;i<returnArr.length;i++){
var nowPo = returnArr[i];
for(var j = i+1 ;j<returnArr.length;j++){
if(cc.pSameAs(returnArr[j],nowPo)){
returnArr.splice(j,1);
j--
}
}
}
return returnArr
},