获取键盘输入 Cpp -- 没有外部库
Posted
技术标签:
【中文标题】获取键盘输入 Cpp -- 没有外部库【英文标题】:Getting Keyboard Input Cpp -- No external Libraries 【发布时间】:2018-07-29 05:30:26 【问题描述】:我正在尝试使用 OpenGL 和 C++ 创建一个游戏引擎,除了 OpenGL 本身之外没有任何外部库。接收键盘/鼠标输入的最佳方式是什么?我知道std::cin
会起作用,但它会停止线程并将其放在另一个线程上很烦人。感谢任何人回答这个问题!
【问题讨论】:
如何在没有任何外部库的情况下将 OpenGL 附加到帧缓冲区? 我不确定std::cin
是否是游戏引擎的最佳选择。改为使用非阻塞键盘 I/O,需要特定于操作系统的实现。充其量,您可以在单独的线程中从std::cin
进行输入。 (我假设您不将标准库算作“外部库”,它也提供std::thread
。)我对SO: I/O in concurrent program 的回答可能会有所帮助。
@RichardCritten “外部库”可能是不吉利的措辞。似乎 OP 排除了 OS 库以及 C++ std 库。所以,"3rd party libraries" 可能会匹配得更好。
顺便说一句。 C++ 标准库(我知道)中没有考虑鼠标输入。鼠标处理是每个 GUI 库/框架(例如 Qt)的重要组成部分,尽管这些 GUI 库通常构建在 OS 特定库之上。因此,鼠标处理肯定可以在没有任何 GUI 库的情况下实现,但又需要特定于操作系统的实现。
【参考方案1】:
您不想使用任何库,这让您的生活变得更加艰难。没有库的唯一真正选择是 std::cin,甚至它也是 iostream 库的一部分。
std::cin 实际上能够实时为您提供输入,而无需用户按回车键。您通常需要按 enter 的原因是因为许多终端在“烹饪”输入的默认模式下运行。这意味着终端本身(不是 C++)等待用户按 Enter,(通过等待用户完成他的命令来“烹饪”它)然后将输入交给 C++,以便在输入完成后对其进行操作按下。但是,您可以将终端设置为原始输出,std::cin 将在输入时获取输入。查看此程序:
#include <stdlib.h> // for using system()
int main()
system("stty raw");
char that;
while(cin >> that)
cout << that;
它会在收到输入时读取并立即将其打印回给用户。第一个 system() 命令将终端设置为原始输出模式,即终端将其接收到的输入立即吐出给 C++ 进行处理。该 system() 命令取决于系统(例如,“stty raw”适用于 Mac OS,但不一定适用于其他平台),您需要为其提供的参数将取决于您的目标操作系统。
所以,简而言之,std::cin 可以用于实时键盘输入。
但这不应该是你的情况,因为你也需要鼠标输入。没有处理鼠标输入的标准 C++ 库,任何处理鼠标输入的库几乎肯定也处理键盘输入。此外,最好避免在 C++ 中为numerous reasons. 使用 system() 命令。由于您也在尝试使用 OpenGL,因此很难就适合您的库提出建议。如果我是你,我会考虑使用特定于操作系统的库,因为在不重写的情况下让你的提案跨平台几乎是不可能的。不要害怕使用外部库:它们是你的朋友,编写是有原因的。
【讨论】:
以上是关于获取键盘输入 Cpp -- 没有外部库的主要内容,如果未能解决你的问题,请参考以下文章