Cocos2d-x制作跳棋结束总结

时间:2022-05-18 09:07:19

         

                            花了近一个月将跳棋制作完成了,由一个月前刚刚接触Cocos2d-x这款游戏引擎到现在跳棋制作的完成,我深刻感受到Cocos2d-x对于2d游戏的制作是多么的方便,接下来跟大家分享一下这一个月来我对Cocos2d-x制作游戏的总结和一些注意事项吧~~


                 刚开始我花了一个星期看视频教程,该视频教程是教我做出一个贪吃蛇的小游戏,在做游戏的时候首先要做的第一步就是构思游戏的逻辑,整个游戏分几个界面,每个界面都包含些什么,精灵?按钮? 如果是精灵的话那么精灵又应该有哪些动作,它本身有哪些属性。是按钮的话那么又要有多少个按钮,每个按钮要完成什么功能。

                 比如跳棋, 主菜单界面首先要有开始按钮、帮助按钮、退出按钮,跳棋又有多人模式和双人模式,那么点击开始按钮后又要开始选择游戏模式,这样又需要两个按钮,分别来表示多人和双人,然后双人模式下又要选择棋子的颜色来代表自己和电脑,所有又需要表示六种不同颜色棋子的按钮来选择,总的来说主界面需要十一个按钮。

                 在游戏界面我们就需要棋子,棋子又有两种不同的动作,所以棋子就应当是一个精灵,我们就要封装一个精灵类,这个精灵类要包含棋子的坐标和棋子本身要有的动作(移动move,跳跃jump)。

                 大概的逻辑想好之后就要开始动手做了,由于跳棋是我独立完成的并没有美工帮我所有在学习Cocos2d-x过程中又锻炼了我对Photoshop的使用,游戏中的棋子、按钮、棋盘、棋格都是通过Photoshop做出来的,虽然有点low,不过也总算有模有样了……所以素材制作被我列为了第一步。

                 第二步就开始界面设计了,主界面比较简单就不多说了,主要说在游戏界面遇到的问题,遇到的第一个问题就是棋子的定位问题,在定位前棋子精灵已经封装好了,由于棋盘并不是用代码创建的,所以配合棋盘将棋子定位的正确的位置成为我的第一个问题,不过很快找到锚点并花了一会功能将棋子定位好了。接下来是要棋子动起来,我在图层Layer中加了触摸事件,在触摸回调函数onTouchBegin中获取触摸坐标并按照棋子半径对坐标进行换算将其变成容易判断的棋盘坐标,接下来我们要判断棋盘上哪个地方可以走哪个地方不能走,这样就需要一个二维数组来记录棋盘上各个位置的状态了,每次将触摸坐标换算成棋盘坐标后带入到棋盘数组中判断相应位置是否有棋子,若有则判断这个棋子是不是属于自己的棋子,若是则继续选择棋盘接下来自己想走的位置,在触摸函数中判断该点为空则开始判断该点与选中的棋子是什么关系,可走?可跳?或者什么都不能做那就判断其为无效点不做任何操作。

                            在棋子封装跳跃的动作时考虑到棋子可能会跳很多下并且次数不确定,一开始我选择用DelayTime来解决它,后来发现这个方法繁琐不好操作不过在同学的推荐下看了一位博主对于执行一系列动作的小技巧的博文觉得很受用就学来用来解决棋子产生动作(这个小技巧为我后来多人模式下AI的实现提供了极大的便捷)。

                        接下来第三步是AI的实现,我用了A*算法,这个算法很好用,不过我的判断部分没有写好判断出来的路径并不是最短的但是也达到了目的,在使用递归时一定要注意递归完成后回滚了但是你在递归过程中改变的变量并不会回滚,如果你在回滚后要用到递归前的数据要记得回滚后要将被改变的数据还原。

                 第四步就是胜负判断,这个很简单。在第一步中建立了二维数组来记录棋盘状态,我们只要在走完每一步就去判断棋盘状态是否已经有一方棋子占满了正对方的位置这样就产生了结果。


                 其实制作过程说起来简单,但是在制作过程中会遇到很多很多奇奇怪怪的问题,比如在用触摸判断来让棋子移动时可能棋子会乱跳又或者并不是你自己选中的棋子跳到目标位置、在AI中起跳的电脑棋子并不是最终遍历出来的棋子等等……这时候要学会调试(单步调试、多步调试)。还要会用CCLOG进行实时调试,CCLOG方法对AI调试有很好的效果,谁用谁知道~~

                 最后跟Cocos2d-x初学者的各位一个建议: 在设计游戏过程中如果遇到需要保存很多数据并且还不确定是多少数据的情况时使用容器或者动态数组来保存数据是上上策,因为如果你用了自己定义个数组去保存的话万一数据量超出了你定义数组的最大量的话编译器不会报错也不会提醒你,这时候你不知道也不会去管理它那么他超出的部分可能会影响到你其他变量的值,要知道游戏中的每一个变量都是有自己意义的,一旦数组越界导致该变量产生改变可能导致游戏崩溃或者不正常。打个比方吧,想我AI算法中用了数组去保存遍历过程中的坐标,一开始我定义的数组容量是10,一开始游戏是正常的,当棋子布局变得很复杂的时候遍历保存的数据可能超过10,这时候要么棋盘上的棋子会乱跳要么游戏直接就崩溃了,当我调试的时候发现该数组的下标直接崩到了3000+,吓了我一跳,一开始我以为是真的遍历了这么多遍,但是后来发现其他地方的变量也莫名其妙的变化才想到这是数组越界产生的一些后果。所以我们应该用容器或动态数组来避免这不必要的麻烦,这个问题不仅是麻烦而且还不容易想到和发现也实在让人头疼…………

                  作为初学Cocos2d-x的小菜鸡希望路过的大神口下请留情,也希望能给初学者一些有用的建议~~谢谢阅读!