梦幻之旅游戏开发--辅助知识的了解
如果一上来就让大家接触这一个拥有3万多行的代码,我想也是非常困难的,鉴于此我决定先把基础的东西弄好。下一步就简单了。
1.从概念上对XNA架构的理解
1)GraphicsDeviceManager:在XNA类库中,这个是非常重要的,它为开发者提供方法管理目标设备的显卡资源。简单的说就是调用显卡的一个接口,该对象的GraphicsDevice属性代表当前目标设备的显卡。
2)SpriteBatch:该对象的主要作用就是绘制文字和2D图像。在游戏开发过程中,他的作用是非常重要的,因为游戏需要的大部分是图片,文字和声音等素材资源。所有游戏中需要显示的画面都必须经过SpriteBatch对象中的Draw方法来绘制。
3)Initialize():该方法用来初始化游戏程序的变量和对象。它允许游戏在运行之前做一些初始化的操作。可以在此时长爱荷香任何需要的服务和载入与图形无关的的内容。例如显卡设备,游戏的窗口大小等等。
4)LoadContent():当初始化完毕后,程序就进入LoadContent,该方法用来加载游戏的素材,包括游戏的模式、图像等。这个方法在一个游戏中只会调用一次,并且是加载所有素材的地方。
5)UpData():该方法相当于Direct3D中的FrameMove,简单地说就是在图形上修改当前画面。它主要用于游戏执行一些逻辑,比如:刷新画面,行走,播放音乐,更新人物状态,监听键盘事件等。
6)Draw():该方法相当于Windows编程的Paint,是系统自动绘图的方法。
游戏程序执行完LoadContent后,开始进入一个游戏循环,无论用什么语言编写游戏程序,都需要一个游戏循环,这也是游戏程序与应用程序的最大区别。在XNA游戏项目中,游戏循环主要由Update和Draw两个方法组成。XNA的生命周期如图18所示。
图1 XNA游戏生命周期
从上图可知,当游戏程序执行完Initialize,LoadContent方法后,即初始化图像,声音和输入控制器,载入游戏资源(图片,声音等)后开始进入游戏循环,Update方法有两个出口,如果游戏继续执行,则执行Draw方法;如果游戏结束,则执行UpLoadContent方法。
2.游戏的基本流程
一个游戏基本上是一个连续的循环体,它完成一系列的逻辑操作,并在屏幕上绘制图像,具体流程如下:
(1)初始化:在这一步中,游戏程序执行标准的初始化操作,如分配内存,资源采集,从磁盘上载入数据等等,这和其他的Windows应用程序一样。
(2)进入游戏循环:在这一步中,游戏代码将进入游戏主循环,此时各种游戏动作和情节开始运行,直到当接受到用户退出游戏的命令。
(3)获取玩家的信息:在这一步中,游戏玩家的信息被加载,已备下一步游戏逻辑使用
(4)执行游戏逻辑:这部分包括了游戏代码主体,其结果用于渲染下一帧对象
(5)渲染下一帧对象:玩家信息的获取和执行游戏逻辑的结果被用来产生下一帧,这个图像通常放在不可见的缓存区内,因此玩家不会看到它逐渐被渲染的过程。随后该图像被拷贝到显示存储器中并显示出来。
(6)同步显示:通过由于游戏复杂程度不同,游戏在计算机上运行速度不同,使用定时器和等待函数确保游戏和游戏最大帧同步。
(7)循环:返回到游戏入口并重新执行上述全部步骤。
(8)关闭:这一步游戏结束,表示游戏将退出主循环或者称为游戏循环,并回到操作系统,然而,在用户进行结束之前,用户必须释放所有的资源并清理系统。
3.游戏算法相关知识
3.1广度优先搜索算法(英语:Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。
BFS是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。他实现的主要是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。
从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的伫列中。一般的实现里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如伫列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)
(1)首先将根节点放入伫列中。
(2)从伫列中取出第一个节点,并检验它是否为目标。如果找到目标,则结束搜寻并回传结果。否则将它所有尚未检验过的直接子节点加入伫列中。
(3)若伫列为空,表示整张图都检查过了——亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。
(4)重复步骤2。
3.2深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
举例说明之:图2是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)->C->F->H->G->D(没有路,最终回溯到A,A也没有未访问的相邻节点,本次搜索结束)
图2 无向图
简要说明深度优先搜索的特点:每次深度优先搜索的结果必然是图的一个连通分量.深度优先搜索可以从多点发起.如果将每个节点在深度优先搜索过程中的"结束时间"排序(具体做法是创建一个list,然后在每个节点的相邻节点都已被访问的情况下,将该节点加入list结尾,然后逆转整个链表),则我们可以得到所谓的"拓扑排序"。
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。当然,当人们刚刚掌握深度优先搜索的时候常常用它来走迷宫.事实上我们还有别的方法,那就是广度优先搜索(BFS).状态(state):状态是制问题求解过程中每一步的状况。
算符(operater)算符是把问题从一种状态变换到另一种状态的方法代号。算符的取值范围就是搜索的范围。(一般设为局部变量)。
结点(node):用来表明状态特征及相关信息。
深度优先搜索用一个数组存放产生的所有状态。
(1)把初始状态放入数组中,设为当前状态;
(2)扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;
(3)判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态;
(4)判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法。
(5)如果数组为空,说明无解。