Candy Crush 游戏制作及消除算法分析
发表于 2013-12-30 16:55:28

最近做类似Candy Crush的消除类游戏,现在和大家分享下关于candy移动消除这一块,望大神们多多指点……

首先,移动后candy的消除分为两大类,第一大类就是你移动交换的两个candy发生消除,例如你移动百消球和临近的普通candy进行交换,这时候消除和普通candy颜色一样的candy。

第二大类是你移动后,相临的大于等于三个candy的可以产生消除。

现在分析下第一大类:两个交换移动之后产生消除。

对了,在这里说一下candy的创建。 candy我是利用工厂模式创建的,第一层分类为颜色,第二层分类为某种颜色下横【横闪】、竖【纵闪】和方块【爆炸圈】,最终肯定有个特殊【百消球】。

其中前四类是需要特殊处理的,后三类列为其他情况即可。其他情况只需要进行个返回原位置操作即可。

然后分析下第二大类:移动后,相临的大于等于三个candy的可以产生消除。

这时候先分析下如果相邻的没有特殊的candy,即交换能构成消除,三个candy消除,四个根据方向形成纵闪或横闪,五个纵或横形成百消球,五个但是带折角的形成爆炸圈。这时候在交换的那个位置形成特殊的candy即可。

在完成这个操作之后,可能会产生特殊的candy,这时候如果我们再进行移动交换,移动完毕后就可能在这相邻的里面有特殊的,我们先处理这些特殊的,然后再和原有该消除的合并即可。

关于数据的存储处理,大家可以在candy中加个标识,表示当前candy是否加入到了vector【即将被消除的candy】中。

消除类游戏主要是写好逻辑算法,让其达到最优。我制作游戏期间出现最多的问题就是这个应该消除的candy怎么个存储法。

主体思路,简单说下:

在主场景中加入你的游戏层,我习惯性是GameLayer,此文件中两个类,一个是CGameLayer,一个是CChessBox,CChessBox就是你的candy布局,在这里我称之为棋盘,注意CGameLayer创建的时候要留好接口,比如关卡信息,游戏层的位置。为什么要留游戏层的位置这个接口呢?因为你的棋盘不可能是固定不变的,不同的关卡位置可能发生变化,这样子你留好了位置接口之后就可以在不再用引擎那费劲的转化,到时候自己再判断区域的时候处理下x/y即可。

说完接口,我们简单再说下这个棋盘,为什么要有棋盘呢?因为我们看到的cand的移动,其实就是忽悠人的,我们程序操作的都是棋盘。下面看下我的棋盘接口:

在游戏层中存放个可变长的CChessBox数组,这样子游戏的棋盘就出来了。点击移动操作什么的都是针对棋盘,而CBoxContent就是个表现,有些同学这时候会问为什么为什么要有CBoxContent,其实我之前的行上列左等都是CBoxContent的属性,后来调节给了CChessBox,行上等属性在CBoxContent中很不方便,另外在CBoxContent添加m_pSkin存放candy也是为了后期的扩展。

友情提醒下,就是移动后candy的删除问题。你最好在你的工厂中保存下释放的candy,这样子可以提高效率,避免每次都创建精灵。

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】