游戏中的控制台types的界面

我目前正在使用XNA在C#中编写一个非常简单的二维游戏。

我想知道如何在一个游戏或graphics软件中实现一个控制台types的界面,就像在天际或反恐精英或更多的游戏?

这些“游戏机”可以让你通过各种命令直接在游戏中改变许多参数。

我觉得这非常有趣的debugging目的,我希望在我的程序中实现类似的东西。 有没有一个特定的方法来实现这一目标?

graphics方面应该很容易,所以我会省略。

你必须能够正确parsing你的input。 如果你想全力以赴,可以阅读编译器理论,但我不认为这是你正在寻找的东西。

一般来说,你希望能够做的是对你的input进行词法分析。 这意味着能够获取一个string并输出令牌。 令牌是指明什么是特定文本的对象,因此,对于variables或“运算符”对象,您将拥有一个“id”对象。它不必是如此“官方”,但是您希望能够告诉string的每个部分是/是。 然后,你会建立一个语法树,也许做语法分析来检查错误,并通过你的处理代码。 如果你是硬核,那就是。 我不认为这是你正在寻找的,所以我只是建议,现在你尝试编码FSM,并寻找关键词。

例如,你可以一次只读一个单词(你可以标记string,并把每个标记放在一个列表中,这是同样的事情,但更安全),对于第一个单词检查是否是一个关键词,如“绑定“或”修改“使用if或switch语句。 然后在每个if / case语句中,你只需要处理这个命令的代码。

所以一个string“修改fov 90”将创建一个3个标记“修改”,“fov”和“90”的列表,如果(stringlist [0] ==“修改”),你可以有更多的if语句,或者你可以有一个全局映射,它接受一个string并返回一个指向fovvariables(或variables本身)的指针,然后你将stringtofloat第三个标记并使用它来设置fov。 只要不要忘记错误检查一切,就像stringtofloat返回一个错误,或者如果你input这个“如果”和string列表只有2个元素,等等

如果你想要一个强大的parsing器,有一些可用的,例如http://www.antlr.org/ 。 该网站看起来像任何非常无聊的IT网站,但图书馆很容易使用,只是我不认为你真的需要这个。

查看性能监控示例,它包含一个很好的控制台,您可以轻松使用。 (只需要控制台类和经理)。 它包含一些很好的代码来注册命令,有参数,和很多的东西。

http://create.msdn.com/en-US/education/catalog/sample/performance_sample

此外,这可能是有点矫枉过正,但我​​个人使用Neoforce控件,其中有一个很好的UI库,包括一个控制台。

https://neoforce.codeplex.com/

你真正的问题是什么? 你有没有遇到任何错误? 你的问题与“我该怎么做”? 那些。 首先,尝试自己做。 当你遇到任何错误,来到这里或到Stackoverflow 。


你可以看看我是如何在Python中执行以下操作的: https : //github.com/Yannbane/Pysole 。

一般来说,我建议你做一个Console类。 这个类接受用户input(你必须要监听它),然后把写入的内容翻译成函数名,然后执行函数,把名字后面写的任何东西作为parameter passing。 你可以查一下字典,这就是我所做的。

我建议你也实现一个Command类。 该类将存储要执行的函数,从控制台的角度来看函数的名称(需要为要执行的函数编写的内容),获取的参数的数量,描述等等。 这些命令可以被添加到控制台,我强烈建议你不要硬编码它们,而是为用户(在这种情况下)提供一种方法来对console.addCommand进行命令(或者只是将它们推送到一个数组)。

让控制台自己生成一个help命令通常是明智的,它列出了所有已知的命令及其描述。 所有其他的命令应该是用户提供的。

所有被写入或输出的文本(也就是文本)也需要被存储在控制台内,比如.textvariables。 每一帧,你只是渲染所有的文字,并添加一个背景。 或者,您可以使用某种标记来识别单词的颜色等…

其他内置命令可以有:

  • 明确
  • 说明[命令]
  • nargs [命令]
  • 隐藏(不要忘了提供一种隐藏的方法,比如按键)

一般建议:

  • 你可能会想重新使用这个,所以不要让它依赖于你的游戏。 软件devise的关键是代码分离 ,所以它变得可重用。

  • 如果控制台知道如何绘制自己的图像,那就太棒了,但是提供了一种方法来为用户设置(字体,背景,颜色),这样你就可以达到上述目的,而且不必每次重新编码。

  • 有一个历史数组是非常有用的。

这个答案是模糊的,从我的经验来看,我相信这样做的确有很多方法。

我之前通过embeddedIronPython,并将标准in / out / errorredirect到一个DrawableGameComponent类,该类为标准的SpriteBatch文本命令维护一个显示string列表,命令历史logging等,还有一个“热键”来切换控件的Visible属性。 在XNA项目中公开所有的类和对象是很容易的,这样你可以在运行时调整一些东西,提供脚本,类等等。

另外,请不要低估Visual Studio命令窗口的强大function。 (虽然我认为这只适用于VS Pro或更好)。 为了简单的debugging,我添加了一个案例给我的键盘处理程序来调用

 Debugger.Break(); 

当我需要在执行的某个时候停止,然后使用命令窗口来改变游戏状态。