这个消除方法其实就是上上一篇文章的那个游戏当中的,如果你有兴趣的话,你可以到上上一篇文章中下载下来,也收到了几个反馈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--;
}
}
}
}
}
至此我们已经收集到来个集合了,里面都是我们从大容器中拿来的满足消除条件和各方向的块了,剩下的就是分情况去处理他们了。好了。
感谢关注日宅记~
网友评论