|
《Windows游戏编程大师技巧》(第二版)第11章(19) 由人工智能控制的演示 记录游戏的第二个方法是借助于编写的人工智能“bot”(机器人)来执行游戏,就像人们联网玩Quake一样。bot在游戏处于演示模式时会如同一个参与游戏的人工智能角色一样地玩游戏。这种方法惟一的问题(除技术复杂外)是bot可能没有展示出所有“酷”的房间、武器等等,因为它并不知道它在制作游戏的演示。另一方面,采用bot参与游戏的最大好处是每一个演示都不相同,并且这种多样性在展示游戏的时候很有价值,因为观看者不会觉得乏味。 在游戏中制作bot和制作其他的人工智能角色一样。基本上你只需将其与你的游戏输入接口连接起来并重载标准输入流即可,如图11-13的C所示。然后为bot编写人工智能算法,设定一些主要的目标,如找出迷宫的路径、射杀所见的每一个东西,或其他任务等。之后就简单了,你只需任由bot运行,直到玩家取而代之。 保存游戏的手段 在游戏编程中,编写保存游戏部分是最令人头疼的事情之一。这是游戏程序员最后才做的事情之一。关键是编写游戏的时候,就要考虑到你所编写的游戏应当为玩家提供保存游戏进度的功能。 在任何时候都能保存游戏意味着要记录游戏中每一个变量和每一个对象。因此在一个文件中,你必须记录所有的全局变量和每个对象的状态。最佳的实现途径是采用面向对象的方法来处理。与其编写一个函数去记录每个对象的状态和所有的全局变量,倒不如使每个对象知道如何将自己的状态读出并写入磁盘文件。 为保存游戏,你所要做的就是编写全局变量然后创建一个简单的函数。由函数通知游戏中的每个对象将其自身的状态写出。然后,当需要读回游戏进度的时候,你要做的就只是将这些全局变量读入系统,然后将所有对象的状态读入游戏。 用这种办法,如果你新增加了一个对象或对象类型,加载/保存过程只局限于该对象自身,而不会影响整个程序。 实现多人游戏 下一个游戏编程的花招是实现多人游戏。当然,如果你想编写一个网络游戏,那就另当别论了——尽管DirectPlay使得通信部分变得更为容易。然而,如果你希望的只是让两个或两个以上的玩家同时或轮流地玩你的游戏,那你只需增加一些额外的数据结构、稍微调整一下程序即可。 轮流 轮流的实现既简单又复杂。说其简单是因为既然你能够实现一个玩家,为了实现两个或更多玩家,只需提供多于一个的游戏玩家记录即可。说它难是因为在切换时你必须为每一个玩游戏者提供游戏保存的功能。所以通常而言,如果你的游戏需要具备轮流切换选项,你就必须在游戏中实现保存的功能。显而易见,游戏玩家在轮换的时候并不知道游戏已被保存。 根据这点,下面依次列出了两人轮流玩的游戏所需的制作步骤: 1. 开始游戏,玩家1开始。 2. 玩家1玩游戏直到结束。 3. 玩家1的游戏状态被保存,玩家2开始。 4. 玩家2玩游戏直到结束。 5. 玩家2的状态被保存(这时进行轮换)。 6. 将玩家1先前被保存的游戏重新加载,玩家1继续。 7. 回到步骤2。 你可以看到,轮换发生于步骤5,随后游戏便在两个玩家间轮流进行。假如游戏的玩家是两个以上,只需简单地在他们间轮流进行(一次只能一个人玩),直到轮流到最后一个,然后再从头开始。 分屏 实现两个或两个以上的玩家同时在同一个屏幕上玩游戏比玩家轮流交换要复杂一些。因为你不得不将游戏编写得复杂一些——将玩家间的游戏规则、冲突和交互考虑进去。而且在同一时刻多人玩的情况下,你必须为每个玩家分配指定的输入设备。这通常是指每个玩家分配一根游戏操纵杆,或一个玩家使用键盘而另一个使用游戏杆。 同一时刻多人参与的游戏还有一个问题是,一些游戏并不适于这样做。例如在卷轴游戏中,一个玩家想走这条路而另一个玩家却想走另一条路。这将造成抵触,你不得不予以考虑。因此最适于多人同时玩的是单屏幕格斗游戏,或多人为了同一个目标而走到一起的游戏。 但如果你允许玩家自由地走动,这时你可以创建如图11-14所示的分屏的显示。 图11-14:分屏游戏显示 多画面显示的惟一问题是多画面显示!你必须产生出两个或更多的游戏画面。这在技术上极具挑战性。此外,屏幕上或许没有足够的空间用于显示两幅或两幅以上的画面,因而玩家很难看到所发生的事情。但是如果你能实现分屏功能,最起码它是一个非常酷的选项…… 多线程编程技术 到目前为止,本书所谈及的所有演示程序都是使用单线程事件循环和编程模型。事件循环对玩家的输入作出响应并以每秒30帧以上的速度渲染游戏画面。在对玩家作出反应的同时,游戏每秒要执行数百万次的运算,同时处理数十或数百个诸如绘制所有的物体、取得输入数据、播放音乐等小任务。图11-15展示了标准游戏循环。
|