如何判断游戏是否通关?通关后如何重新开始游戏,让用户重玩?今天给大家详细介绍如何实现以上功能。先看一下数独游戏通关后的提示界面,截图如下:
首先,我们需要判断游戏是否通关,那么如何判断呢?有两个条件:1、数字面板已经全部填满;2、没有显示数字重复预警。游戏通关的流程如下:用户填入数字后,判断是否通关,如通关,则将计时暂停并将游戏状态改为5(表示通关),绘制场景函数将显示游戏通关及重玩提示对话框,用户点“重玩”按钮后游戏重新初始化。下面先看看通关判断函数的代码:
用户填入数字后,判断是否通关,如通关则更改游戏状态值为5。接下来看看judgeWin()函数的代码
judgeWin()函数判断是否通关,首先判断是否产生数字重复预警,接着判断数字面板是否全部填满,如没有预警且数字已填满则通关,否则未通关。resetGame()函数负责重新初始化数字面板中的固定数字,并重新计时。由于使用了新的游戏状态值5,所以绘制游戏场景的函数代码需要修改,修改后的代码如下:
增加了游戏状态值为5时的处理代码,即显示游戏通关提示及重玩对话框。前面说过,游戏通关时会暂停计时,那么此功能是如何实现的呢?很简单,我们在计时函数中添加判断是否通关的代码,如通关则不计时。没听明白?没关系,看代码:
在计时前,先判断游戏是否通关了,如已通关则返回,不计时;否则,以秒为单位计时(调用timeElapse()时传入的n值为1000,表示1000毫秒)。最后,说一说游戏通关及重玩提示对话框如何实现的,其实此对话框重用了上节课gxsDialog类的代码,只不过使用了不同的资源图片,首先就是游戏通关及重玩对话框的图片(需要修改资源类的待加载资源名称数组),代码如下:
"pass.png"是通关及重玩对话框图片,"replay.png"是正常状态的重玩按钮图片,"replayd.png"是按下状态的重玩按钮图片。接着是通关及重玩对话框、重玩按钮的初始化代码:
var g_oReplay=new gxsButtonUI("replay");//重玩按钮
var g_oWinDialog=new gxsDialog("pass");//游戏通关及重玩对话框
最后,如何实现游戏重新初始化数据及重玩的功能呢?我们可以在重玩按钮的事件响应回调函数中进行处理,这里我把此功能放在它的父类对话框中实现。为了能让按钮类调用对话框类的回调函数,给按钮类添加一个指向父类的成员变量pParent,代码如下:
再给对话框类定义一个调用回调函数的函数,代码如下:
正如你所见,我把回调函数放在控件初始化参数数组中,这样callFCB()与gxsDialog类实际绑定的对象无关。现在,还有一个问题,如何将gxsDialog类对象绑定给gxsButtonUI类?即在什么地方将gxsDialog类对象赋给gxsButtonUI类的pParent成员变量?看代码:
在对话框的draw()函数中将gxsDialog对象实例赋给它的ButtonUI类子控件的pParent成员变量,这样就可以在按钮控件的事件回调函数中通过pParent调用对话框类的事件回调函数。最后,让我们看一看游戏通关及重玩对话框、重玩按钮的参数初始化代码:
关键是g_oReplay.pParent.callFCB();这一行代码,它表示调用重玩按钮的父对话框(游戏通关及重玩对话框)的事件回调函数,下面,看看游戏通关及重玩对话框的初始化参数,代码如下:
最关键的就是g_oGameData.resetGame()这条语句,其作用前面已经说了,重新初始化游戏,让用户重新玩。child:[15]表示子控件为“控件初始化数组中索引为15的控件”——即“重玩”按钮。最后,将今天的内容录了一个视频,文章未提到的地方可以参看视频。
未完待续,敬请关注!后续更精彩,谢谢大家!