在应用程序中编写控制台

Elg*_*oog 9 c++ shell console sfml

我的应用程序需要在应用程序窗口中嵌入控制台,例如,在autoCAD中,控制台位于窗口底部等待命令.

在此输入图像描述

我需要在我的应用程序中使用控制台,以便我可以更改变量和其他内容,因此控制台不需要是一个完全爆炸的shell.

目前我的应用程序中有一个简单的控制台,但与终端(shell)相比,它看起来非常笨重,这就是我想要控制台的样子.

在此输入图像描述

我用控制台完成它的方式是当用户按下TAB控制台显示的键时,他们可以输入他们的命令/行; 一旦Return按下了键,就会解析它们键入的字符串并处理该命令.

我正在使用sf::Text对象在我的应用程序窗口中打印文本.总共使用了5个sf::Text对象,4个用于以前的命令/错误消息,1个用于当前命令行.当Return按下该键时,第4个sf::Text将其当前字符串更改为第3个,第3个到第2个,第2个到第1个,第1个更改为当前命令字符串,然后当前命令字符串被清除并准备再次输入.这样就有4个"历史"命令和/或错误的空间.不是最好的,但它是我能想到的最好的.当然,可以通过添加更多sf::Text对象来更改历史记录的数量.所以最后这就是我将控制台渲染到屏幕的方式

sf::RectangleShape rectangle;

rectangle.setSize(sf::Vector2f(App->getSize().x, App->getSize().y / 3));
rectangle.setPosition(0, 0);

rectangle.setFillColor(sf::Color::black);

App->draw(rectangle);   // This renders the console looking background rectangle
App->draw(CLine);   // This renders the current command line

for(int i = 4; i >= 0; --i) // This renders the history as described above, their idevidual positions are setup earlier on in the program
{
    CHistory[i].setString(CS[i]);
    App->draw(CHistory[i]);
}
Run Code Online (Sandbox Code Playgroud)

App 只是一个 sf::RenderWindow*

我的整体问题是,有没有办法可以将控制台嵌入到我的SFML窗口中,而不必仅仅是一个文本对象的图像,就像我上面那样呈现为控制台.我希望在我的应用程序中有一个实际的控制台/ shell /终端.像标准的bash shell一样,但当然是我自己的shell解释器.

Rad*_*aid 0

好吧,如果你想让它感觉更像一个控制台,你可能想要的是:

  • 能够通过一键按下来打开和关闭它,可能类似于~,它被经常使用。
  • 为您正在键入的行提供背景颜色,可能是透明的,但至少确保它不仅仅是浮动在渲染窗口上的文本。如果命令的输出是多行,请确保它们全部可见,或者人们至少可以滚动浏览历史记录。
  • 确保命令易于理解且一致。例如,如果我没有记错的话,源引擎上的许多游戏都使用cl_与渲染相关的前缀。参见cl_showfps 1例如。
  • 传统的终端输入会是一个不错的选择。向上显示您之前填写的命令。如果您喜欢冒险,可以使用 Tab 完成。
  • 如果您还有时间,通过例如显示可用命令的方式--help也会很好。当然,这取决于您的游戏的复杂程度。

其余的,看看其他游戏是如何做到这一点的。您提到了《Quake》,它是游戏内终端的一个很好的例子。我认为很多 Source 游戏中的那个也很容易使用(参见《半条命 2》、《反恐精英 Source》、《军团要塞 2》、《求生之路 4》等)。我认为没有任何标准库可以实现这一点,不包括其他框架,如 OGRE 或 IrrLicht。