李爱军
(苏州职业大学计算机工程学院 苏州 215104)
基于Cocos2d的迷宫游戏的设计与实现
李爱军
(苏州职业大学计算机工程学院苏州215104)
本游戏用Xcode开发,并基于Cocos2d,开发过程中运用了流程控制、菜单、特效、精灵等技术开发。苹果游戏开发模式虽然说看似封闭,但是从另一方面却极大地激起开发者兴趣。
迷宫手机游戏Cocos2d-X
迷宫游戏设计目的是训练人的思维能力,为了解决玩家在等公交车,放松休息,在咖啡厅等悠闲时间无聊的问题,既不占用工作时间,又可以给玩家带来乐趣。游戏更是设计了众多关卡,随着关卡的增加,游戏难度会逐渐增加,让玩家可以尽情享受游戏的乐趣。
本游戏设计是单机类迷宫闯关小游戏,相比于电脑版的闯关类迷宫类小游戏,在操作方面更加的简洁方便,画面更加的明了。为了保证游戏的流畅性,游戏在计算步骤方面运用了不算太过于冗长的代码,但同时有保证了游戏的乐趣性。在整个游戏中,实现以下功能。
1、进入游戏界面,出现游戏介绍和游戏开始的选项;
2、游戏进行时,可以选择返回选项;
3、当迷宫人物路线选择错误,人物可以自动回到起点;
4、玩家可以随意游戏的关卡,不会被限制于固定关卡;
5、游戏关卡的排列,确保排列格式为蛇形排列;
6、脚印图形的嵌入,当人物进入出口时,界面自动跳转为游戏的关卡选择界面;
7、设计每张图形的路线,从第一关开始逐渐加大游戏的难度;
8、当游戏进入或者退出关卡时,切换界面的方式的选择为切入;
9、当人物选择路线的方向固定时,游戏自动控制人物走到方向选择路口,优化游戏操作。
如图1。
主视图初始化模块:创建并添加游戏视图,添加游戏关卡的选择视图,通关关卡视图,返回界面选择视图。
迷宫初始化模块:清空人物相应位置的信息,将地图上面的人物位置移动到初始化位置。
迷宫关卡选择模块;选择游戏的关卡,一共40关迷宫,玩家可以自由选择迷宫的关卡,突显游戏的高度自由。
游戏介绍模块:游戏开始时,玩家可以通过游戏简介加快对游戏的了解,以便玩家可以尽快的上手游戏。
判断游戏通过模块:玩家通过自己的计算步骤,并且走入终点,该模块通过判断玩家控制的人物是否到达终点来决定是否通过关卡。
返回关卡选择模块:当玩家未通过此关卡时,玩家可以选择返回,返回到游戏关卡选择界面,重新选择游戏其他关卡进行游戏。
A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法。估价值与实际值越接近,估价函数取得就越好。例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即:f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。
通过使用A*算法实现将人物移动到指定的位置,如果路径不存在,则无法移动。因为这里A*寻路算法是有个概念的,就是有个路径最短的计算方法:f=g+h,简单的讲就是这个节点到达目的节点的距离f等于这个节点周围的一个节点到达这个节点的距离g值再加上周围节点到达目的节点的距离h值。
寻路的第一步是简化成容易控制的搜索区域。怎么处理要根据游戏来决定了。例如,我们可以将搜索区域划分成像素点,但是这样的划分粒度对于我们这款基于方块的游戏来说太高了。作为代替,我们使用方块(一个正方形)作为寻路算法的单元。其他的形状类型也是可能的(比如三角形或者六边形),但是正方形是最简单并且最适合我们需求的。
像那样去划分,我们的搜索区域可以简单的用一个地图大小的二维数组去表示。所以如果是25*25方块大小的地图,我们的搜索区域将会是一个有625个正方形的数组。如果我们把地图划分成像素点,搜索区域就是一个有640,000个正方形的数组了(一个方块是32*32像素)。我们将会给每个方块一个G+H和值。G是从开始点A到当前方块的移动量。所以从开始点A到相邻小方块的移动量为1,该值会随着离开始点越来越远而增大。H是从当前方块到目标点(我们把它称为点B,代表骨头!)的移动量估算值。这个常被称为探视,因为我们不确定移动量是多少-仅仅是一个估算值。
G是从开始点A到达当前方块的移动量。为了计算出G的值,我们需要从它的前继(上一个方块)获取,然后加1。所以,每个方块的G值代表了从点A到该方块所形成路径的总移动量。
H值是从当前方块到终点的移动量估算值(在本游戏中是指方块的数目)。移动量估算值离真实值越接近,最终的路径会更加精确。如果估算值停止作用,很可能生成出来的路径不会是最短的(但是它可能是接近的)。为了让它更简单,我们将使用“曼哈顿距离方法”(也叫“曼哈顿长”或者“城市街区距离”),它只是计算出距离点B,剩下的水平和垂直的方块数量,略去了障碍物或者不同陆地类型的数量。
方法会返回一个数组,里面包含了地图周围的四个节点对象。依次取出地图四周的节点对象,因为是通过点击地图后地图和人才移动的,但是需要检查地图四个方向上是否有人,移动的方向即人面向的方向,如果有则判断哪个节点对象的位置是人物按钮。
-(void)moveNext:(NSButtonNode*)nextNode currentNode:(NSButtonNode*)currentNode
UIButton*oneButton=currentNode.mapButton;UIButton*nextButton=nextNode.button;
第一行意思把当前节点NSButtonNode对象的属性上层按钮赋给一个按钮引用对象。第二行把下一个NSButtonN-ode对象节点的属性下层按钮也赋给一个按钮引用对象。来判断这两个按钮是否是存在的。
假如当前节点的上层按钮属性值是存在的而且下一个节点的下层按钮属性值也是存在的,则可以进行两个节点的按钮属性值交换的操作以实现按钮移动的效果。下一个按钮的 frame值赋值给当前节点对象的上层按钮的frame属性是为了使得将oneButton移动到nextButton的位置时使其位置和大小保持一致。nextButton的tag值也赋给oneB-utton是因为tag值标识了按钮所在的位置,可以通过获取按钮的tag值来判断按钮的位置在第几行第几列,根据这个行列值就可以到NSButtonNode节点对象数组中获取拥有这个按钮的NSButtonNode对象,因为按钮的位置发生变化了所以我们也要更新它的tag值使其与新位置保存一致。设置这个按钮在当前父视图上前置显示。
将当前节点的当前状态值复制另存是为了赋给下一个节点的当前状态值属性,因为这个状态值标识了一个节点对象它所控制的位置给人看到的按钮是何种类型的。地图按钮或者是人物按钮移动位置后就不在当前节点上面了,所以要它的属性mapButton赋值为空。由于当前节点对象的mapButton按钮属性值已为空,那么当前节点对象所控制位置显示的按钮是它的属性button值,也就是就一层按钮了,所以这个节点对象用来标识当前显示的是何种类型的按钮的属性currentState值,要恢复成它之前的状态值,而这个状态值就保存在它的属性lastState中。由于节点原来的状态还原了,所以将属性lastState值赋值为一开始初始化时的枚举值NOSTATE。
把这个引用上一个节点的用于显示在上层的按钮对象赋给下一个节点的用于显示的上层按钮属性。因为下一个节点对象所控制位置显示的按钮发生变化,所以要将它自己原来的状态值保存在属性lastState中,以便人物或者是地图移走后,还能够恢复成原来的状态。因为这个节点对象所控制位置显示在视图上的按钮发生了变化,所以它相应标识的属性currentState也要设置成对应的属性值。
第一个if是指,如果测试节点的周围的这个节点对象已经在openAry数组中了,就判断在这个测试节点的基础上再前进一步到这个属于周围节点中的这个节点的g值是否比它原来算的g值是否要小,如果要小则表示原来要走的节点通过这个测试节点走过去g值更小,距离更加的短,由于已经在开发数组中的节点的g值发生了改变则需要建造堆,也就是对开放数组中的节点进行针对g值的重新排序,使得首节点是g值最小的节点
设置父节点的目的是为了在寻找的测试的节点就是目标节点后通过目标节点的父节点可以进行递归到开始的人的节点,这样做的目的是为了将从人的位置通向目标节点的路径,也就是顺序排列的节点都找出来,在通过倒序后的路径就可以走到目标节点位置的路径了。
节点发生了变化,需要重新按照f值给openAry数组的节点对象进行最小二叉堆的排序如果这个周围的节点对象不在openAry数组里面,就把它加入到openAry数组中,如果此时openAry数组中元素个数是三个或者是三个以上,则进行按照节点对象的属性f值最小二叉堆的排序。也就是使得openAry数组中的首元素的f值是最小的,最小的f值节点对象优先作为最短路径构成选择。
游戏本身是一款可以在iPad运行的迷宫类闯关类小游戏,在游戏打开后直接进入游戏主界面,用户这时可以两个选项:进入进一步的关卡选择或者看游戏简介。当玩家选择关卡时玩家进入选定关卡,继而指挥角色从起点穿过层层障碍到达出口。玩家在这个过程也可以进行游戏的退出,进而可以选择新的关卡,开始新一轮的游戏。
本文在详细论述了基于Cocos2d的迷宫类闯关类小游戏,介绍了系统的主要模块和算法分析以及算法关键代码实现,最后对该游戏平台进行了试运行。此系统具有一定的实用性和应用前景。
[1][美]Rob Napier.Mugunth Kumar,库 玛.iOS编程实战[M].人民邮电出版社,2014.
[2][美]赫乐嘎斯,康威.iOS编程(第4版)[M].华中科技大学出版社,2015.
[3]刘剑卓.Cocos2D-X游戏开发技术精解[M].人民邮电出版社,2013.
李爱军(1973~),男,硕士,讲师,研究方向为面向程序对象设计、数据库技术、IOS开发技术。
Design and Implementation of Maze Game Based on Cocos2d
Li Aijun
(Computers Engineering Institute,Suzhou Vocational UniversitySuzhou215004)
The game with Xcode development,and based on Cocos2d,the process of developing the use of process control,menu,special effects,elves and other technology development.Apple game development model that seems to be closed,but on the other hand is greatly aroused the interest of developers.The design of the original intention of this game is to solve peoplesent in the boring time,exercise the brain,so as to let the game player to find the joy of the game of the.
MazeMobile phone gameCocos2d-X
TP311
A
160607-7303