我已经数次提到了游戏控制台。近年来,通过游戏Quake和Half-Life暴露控制台给玩家,控制台变得越来越流行了。即使你不希望在你的游戏中允许玩家访问控制台,你也应该为了自己使用而纳入控制台到游戏中。控制台在游戏开发过程中是一个强大的工具。有了控制台,我们能以合理和可控的方式在游戏中显示处理流程信息和统计信息到屏幕上。我们可以通过在游戏中(on the fly)设置变量的值,并且可以立马看到效果,这样来调整游戏。如果在发行时我们决定不让玩家访问控制台,我们只要简单的不映射显示控制台的命令。
控制台将被定义成静态类。我们只想要一个控制台存在,并且我们想要它在整个游戏中存在。我们已经看到过一些控制台代码示例了,我们发送的任意异常数据都是发送到控制台的。通过使控制台是静态的,我们可以在游戏引擎任何地方访问它,而不需要取得控制台类的一个特定实例。
为了访问控制台,我们映射打开控制台的函数到键盘上的F12键。你可以选择键盘上的任意键,但是在本例中我选择F12键是因为每个现代键盘上都有这个键,并且它一般不会映射到其他的函数上。
定义控制台组件
在我们设计控制台之前,还需要定义一个保存命令信息的类。为了让控制台不只是一个空有其名如列表框一样的东东(For the console to be more than a glorified list box),我们需要它能够接受和执行命令。类GameCommand将为每个命令保存所需的信息。要记住控制台命令不能只限于游戏引擎本身的需要。任意使用此游戏引擎的游戏将可以添加他们的命令。类GameCommand将需要保存三个信息:命令名字符串;命令的帮助字符串,它解释命令的用法和语法;当命令被输入时需要调用的函数。此控制台处理的每一个命令都接受唯一的一个字符串参数。这样一来,控制台的处理就一致了,在命令后跟一个文本一起传递给命令函数(即使因为命令后不带文本参数的情况,也需要传一个空的字符串)。两个只读的熟悉提供了对命令和帮助字符串的外部访问接口。类的声明如列表2-21所示。
列表2.21:GameCommand 声明
类GameCommand的构造函数(如列表2-22所示)只是接受三个所需要的信息,并且把他们复制到私有成员中去。
列表2.22:GameCommand 构造函数
public GameCommand(string sCmd, string sHelp, CommandFunction pFunc) { m_sCommand = sCmd; m_sHelp = sHelp; m_Function = pFunc; } |
此类需要一个Execute方法,当控制台认出此命令被调用,则调用此方法。此方法的参数是键入的字符串除掉命令的那一部分。在调用此函数前,我们必须验证开发者是否当真提供了回调函数(delegate)。如果是,我们则调用此方法并传递给它一个字符串数据。解析这个字符串并且取得其期望的信息则是此函数的职责了。参加列表2 -23 C #代码的实现。
列表2.23:GameCommand Execute方法
public void Execute( string sData ) { if ( m_Function != null ) { m_Function( sData ); } } |
至此,我们已经定义怎么处理控制台命令了,是时候创建控制台本身了。控制台需要一张图片作为文本的背景。这不仅使控制台好看,还有一个目的就是确保控制台文本和文本后的图片有非常好的对比度。因此控制台的图片则需要相当暗,因为准备为文本使用亮色。无论背景色如何变化,控制台都会保持正面(Any variations in the background color should be kept over to the right side of the console),因为文本很少布满屏幕。
我们可能仅仅当控制台被打开时在屏幕上弹出(pop)它,控制台被关闭时,清除它。虽然这是最简单的解决方案,但是如果在屏幕上显示[刮风1] 控制台会更好看些。对于这个控制台,我们在控制台被打开时从屏幕顶端滑出它来显示它,当它被关闭时又滑回去。控制台覆盖多少屏幕空间是可以调整的。我将设定控制台打开时默认覆盖一半的屏幕空间,稍后提供调整控制台尺寸的方法。
定义控制台类
类Console的属性如列表2-24所示。你将会注意到我们使用了两个不同的容器类。ArrayList类是一个简单的动态数组容器,适合存储在控制台显示的文本行。SortedList类会有一点点复杂。它存储着对象,每个对象与一个关键字关联,并且排序,可以通过关键字折半查找(binary search)来定位对象。使用了两个SortedList容器,每一个都保持了GameCommand类的实例。一组是控制台理解的命令,另一组是控制台能修改的参数。在实际中,参数将。。。(In reality, the parameters will just be more methods that happen to set a variable)。类Console的属性如