消除游戏需要定义的就是它的行数和列数,以及颜色种数。
var GameData = {
W_NUM:10,
H_NUM:10,
CELL_TYPE:2,
}
首先我们建立一个二维数组,设置好位置
_init:function(){
this.cellArr = []
for (var i = 0;i < GameData.W_NUM; i++) {
this.cellArr[i] = []
for(var j = 0;j < GameData.H_NUM;j++){
var sp = new Cell()
sp.setArrIndex(i, j)
sp.setPosition(50 + i*40, cc.winSize.height-40 - j*40)
this.addChild(sp)
this.cellArr[i][j] = sp
}
我们可以用for循环来试先检测一下我们点击色块边上的位置,由于可能有时候色块会比较多,所以我们先用五次
dispell: function (event) {
var touchIndex = event.getUserData() //点击的坐标
cc.log(touchIndex)
var arr = this.checkNeighbor(touchIndex)
//循环五次检测
for(var i = 0;i < Q.H_NUM*2;i++) {
var newArr = arr.slice()
for (var index in arr) {
var po = arr[index]
var newArr = this.filterDelSame(newArr, this.checkNeighbor(po))
}
var size = newArr.length
var oldLen = arr.length
arr = newArr
if(arr.length == oldLen) break
}
//获取到了颜色相同的数组
this.cellFallDown(arr)
}
在这代码里,filterDelSame是我们写的一种检测色块下落,然后色块下标随着移动而改变的代码
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
},
checkNeighbor就是检测我们点击的色块的四周有没有同色的,然后接下里找到第二个继续这样检测的方法
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;
}
cellFallDown是清除色块的一个方法
cellFallDown: function(arrayIndexArr){
//清除同颜色的块儿 并且二维数组中的位置置为null
for(var index in arrayIndexArr){
var arrayIndex = arrayIndexArr[index]
this.cellArr[arrayIndex.x][arrayIndex.y].removeFromParent(true)
this.cellArr[arrayIndex.x][arrayIndex.y] = null
}
for(var i = 0; i < Q.W_NUM;i++){
for(var j = Q.H_NUM - 1; j >= 0;j--){
if(this.cellArr[i][j] == null){
continue
}
var tempAdd = 0
for(var k = j;k < Q.H_NUM;k++){
if(this.cellArr[i][k] == null) tempAdd++
}
this.cellArr[i][j].fallDownNum = tempAdd
}
}
for(var i = 0;i < Q.W_NUM; i++){
for(var j = Q.H_NUM - 1; j >= 0; j-- ){
this.updateCellByFallDownNum(this.cellArr[i][j])
}
}
},
updateCellByFallDownNum是清除并且掉落更新的方法
updateCellByFallDownNum : function(cell){
if(cell == null) return
if(cell.fallDownNum == 0) return
var tempPo = cc.pAdd(cc.p(0, cell.fallDownNum), cell.count)
this.cellArr[tempPo.x][tempPo.y] = cell
this.cellArr[cell.count.x][cell.count.y] = null
cell.fallDown()
cell.fallDownNum = 0
},