常见又好用的消除方法

2018-09-24  本文已影响0人  与时间赛跑_

这个消除方法其实就是上上一篇文章的那个游戏当中的,如果你有兴趣的话,你可以到上上一篇文章中下载下来,也收到了几个反馈bug,有空会尽快迭代。

下面一起来看看里面的一些关于消除的方法:

游戏中的每一个块都是基于网格系统来放置的,市面上的很多消除游戏,基本上都是这样的做法,这样可以很好的定位游戏块的位置,还有应对游戏发生的各种情况。

上图就是块消除的一种方向(这个游戏中只有两个方向上的消除),这个采用的是从网格系统中捕获属性,同步到块中,接着遍历该方向上的块,获取它的是否存在消除条件,让num++,最后判断个数的方法。到这里,对于这种情况,我们可以有很多的方案实现,但是,游戏中还存一种情况;如下:

游戏过程中可能会出现,两个方向或者更多同时都达到消除条件的时候,这里就比较麻烦一点了,所以请看下面的方法:

我们把所以的块放在(蓝色)的大容器中,在检查的时候,把满足方向一的东西拿走放在方向1的容器中,同时去掉大容器中该块,同时修改网格系统中对应网格的属性,方向2也是如此。这样分成不同的方向的容器,在消除的时候就可以完全不用去理块对象是否存在等等各种情况。包括一不小心操作空块的情况。

贴上代码:

int xindex=-1;

 int yindex=-1;

 int xNum[5]={0,0,0,0,0};

 int yNum[5]={0,0,0,0,0};

 bool haveone=false;//记录方向

 bool havetwo=false;

 for(int x=0;x<=4;x++){

 int tiledNum=0;

 for(int y=0;y<=4;y++){

 if(tiledsprite[x][y]->getTiledflag()){

tiledNum++;//个数

            }

 if(tiledNum==5){

                xindex++;

haveone=true;//该方向达成消除

 int io=0;

 for(auto it=tileds.begin();it!=tileds.end();it++){

 auto p_tiled=*(it);

                    xNum[xindex]=x;

 if(p_tiled->getTagX()==x){

                        io++;

 this->cleanTiled.pushBack(p_tiled);//移动到该方向的容器中

tileds.eraseObject(p_tiled);//从主容器消除

it--;//容器元素会重新排序,为了能访问所有块,这里手动-1

                    }

                }

            }

        }

    }

//以下同上

 for(int y=0;y<=4;y++){

 int tiledNum = 0;

 for(int x=0;x<=4;x++){

 if(tiledsprite[x][y]->getTiledflag()){

                tiledNum++;

            }

 if(tiledNum==5){

                yindex++;

 int io=0;

havetwo=true;

 for(auto it=tileds.begin();it!=tileds.end();it++){

 auto p_tiled=*(it);

 if(p_tiled->getTagY()==y){

                        io++;

                        yNum[yindex]=y;

 this->cleanTiledother.pushBack(p_tiled);

                        tileds.eraseObject(p_tiled);

                        it--;

                    }

                }

            }

        }

    }

至此我们已经收集到来个集合了,里面都是我们从大容器中拿来的满足消除条件和各方向的块了,剩下的就是分情况去处理他们了。好了。

感谢关注日宅记~

上一篇 下一篇

猜你喜欢

热点阅读