给每个糖果都标记
this.map = []; //二维数组,通过列号和行号可以快速索引到某个糖果 (存储的一列)
for (var i = 0;i < Constant.MAP_SIZE;i++)//10
{
var column = [];//列
for (var j = 0;j < Constant.MAP_SIZE;j++)
{
var candy = Candy.createRandomType(i,j);
this.mapPanel.addChild(candy);
candy.x = i * Constant.CANDY_WIDTH + Constant.CANDY_WIDTH/2;
candy.y = j * Constant.CANDY_WIDTH + Constant.CANDY_WIDTH/2;
column.push(candy); //列
}
this.map.push(column);
}
},
触摸点击后,判断是否删除
_popCandy: function (column,row) {
if (this.moving)
{
return;
}
var joinCandys = [this.map[column][row]];//最开始点击或者触摸的糖果,放到这个数组里
var index = 0;
//判断是否有重复的糖果
var pushIntoCandys = function (element) {
//indexOf:: 如果要检索的字符串值没有出现,则该方法返回 -1。
if (joinCandys.indexOf(element) < 0)
{
joinCandys.push(element);
}
};
while (index < joinCandys.length)
{
var candy = joinCandys[index];
//检查点击糖果上下左右的糖果存在并且颜色和点击的糖果相同
if (this._checkCandyExist(candy.column-1,candy.row) && this.map[candy.column-1][candy.row].type == candy.type)
{
pushIntoCandys(this.map[candy.column-1][candy.row]);
}
if(this._checkCandyExist(candy.column+1, candy.row) && this.map[candy.column+1][candy.row].type == candy.type){
pushIntoCandys(this.map[candy.column+1][candy.row]);
}
if(this._checkCandyExist(candy.column, candy.row-1) && this.map[candy.column][candy.row-1].type == candy.type){
pushIntoCandys(this.map[candy.column][candy.row-1]);
}
if(this._checkCandyExist(candy.column, candy.row+1) && this.map[candy.column][candy.row+1].type == candy.type){
pushIntoCandys(this.map[candy.column][candy.row+1]);
}
index++;
}
if (joinCandys.length <= 1)
{
return;
}
this.steps++;
this.moving = true;
//删除点击的糖果以及点击的糖果相连的糖果
for (var i = 0; i<joinCandys.length;i++)
{
var candy = joinCandys[i];
this.mapPanel.removeChild(candy);
this.map[candy.column][candy.row] = null;
}
消除完添加
//检查糖果是否存在
_checkCandyExist: function(i, j){
if(i >= 0 && i < Constant.MAP_SIZE && j >= 0 && j < Constant.MAP_SIZE){
return true;
}
return false;
},
_generateNewCandy: function () {
/*
* 遍历糖果矩阵二维数组的每一列,每一列在从下往上遍历该列的每个糖果
* 每列开始遍历时,设置空位计数器为0
* 如果某个位置为null,则表示,该位置的糖果已经在_popCandy中被删除,此时应该吧该列的空位的计数器加1,并在整列的最上方添加一个新随机糖果,并添加到二维数组的该列数据中
* 如果某个位置是糖果,则要改糖果下落,下落的距离就是当前空位计数器的数值.设置糖果下落后,需要调整原位置为null,下落的位置填入该糖果
* 当遍历完最后一个糖果(包括刚新加的糖果)后,该列的工作就完成了.此时需要把超出10的数组位置删除
* */
var maxTime = 0;//空位计数器为0
for (var i = 0; i < Constant.MAP_SIZE; i++) { //deal each column
var missCount = 0;//列
for (var j = 0; j < this.map[i].length; j++) {
var candy = this.map[i][j];
if(!candy){
var candy = Candy.createRandomType(i,Constant.MAP_SIZE+missCount);
this.mapPanel.addChild(candy);
candy.x = candy.column * Constant.CANDY_WIDTH + Constant.CANDY_WIDTH/2;
candy.y = candy.row * Constant.CANDY_WIDTH + Constant.CANDY_WIDTH/2;
this.map[i][candy.row] = candy;
missCount++;
}else{
var fallLength = missCount; //需要下落的步数
if(fallLength > 0){
var duration = Math.sqrt(2*fallLength/Constant.FALL_ACCELERATION);
if(duration > maxTime)
maxTime = duration;
var move = cc.moveTo(duration, candy.x, candy.y-Constant.CANDY_WIDTH*fallLength).easing(cc.easeIn(2)); //easeIn参数是幂,以几次幂加速
candy.runAction(move);
candy.row -= fallLength; //调整所有糖果的行
this.map[i][j] = null;
this.map[i][candy.row] = candy;
}
}
}
//移除超出地图的临时元素位置
for (var j = this.map[i].length; j >= Constant.MAP_SIZE; j--)
{
this.map[i].splice(j, 1);
}
}
this.scheduleOnce(this._finishCandyFalls.bind(this), maxTime);
},