JS 消消乐

给每个糖果都标记

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);

    },




猜你喜欢

转载自blog.csdn.net/qq_41939248/article/details/80356035
今日推荐