gpt4 book ai didi

c++ - 在C/C++中滚动自己的键盘/输入系统

转载 作者:IT老高 更新时间:2023-10-28 22:16:50 25 4
gpt4 key购买 nike

问题:

学习如何创建自己的输入/输出系统需要什么样的资源?

我自己的理解:

我知道这是非常依赖于操作系统的,因此让我们将Linux和Windows分开,并列出两个操作系统的资源(如果可能)。对于Linux,我猜想对X Window系统有一定的了解。对于Windows,我猜是win32 API。尽管如此,我猜测还有很多事情,而不仅仅是了解这些知识,好像我宁愿用C++编写输入系统一样。

提问原因:

我尝试阅读OIS源代码(因为这将以CC++编写),只是不喜欢它的编写方式。因此,我亲自学习了如何为简单的Pong游戏(用C++编写)编写自己的键盘输入/输出系统。

最佳答案

更新:这是我编写的用于处理键盘输入的库。它使用FreeBSD许可证。我什至将其标记为v1.0,因此我认为它是“发布质量”。

https://github.com/depp/keycode

最近,我非常努力地使这种“恰到好处”的游戏成为可能,但我还没有完成。我会分享我所知道的。

关键码

对于游戏,通常需要的是键码。

当您按下键盘上的某个键时,操作系统首先会将按下的按钮转换为键码。按键代码指定按键在键盘上的物理位置。例如,代码4可能对应于美国键盘上标有A的键(即使该键在法国或俄罗斯具有不同的标签)。每个平台都有一组不同的键控代码,或者可能有多组。您可能用不同的名称来知道它们,例如扫描代码或虚拟键代码。

  • Windows使用虚拟键码(MSDN documentation)。它们在各种硬件和软件配置中都是稳定的。您可以在<Winuser.h>头文件中找到定义。在Windows上,如果按最左边的主行键(美国为A,法国为Q),则代码为65。
  • Mac OS X具有自80年代以来一直稳定的键代码。它们在<Carbon/Events.h>中定义。实际上,您不需要链接到Carbon即可使用键控代码,但您需要 header 。在OS X上,如果按最左边的主行键,则会得到代码4。
  • Linux有几个不同的键码集。因此,在Linux上,您有几种选择。您可以使用按键符号(有一些缺点,我将在下面进行解释),可以假定用户正在使用特定的输入驱动程序(如今,Evdev是一个很好的猜测),或者您可以以某种方式找出机器用途。为了获取键码,您必须阅读键盘定义文件。例如,查看/usr/share/X11/xkb/keycodes/evdev以获取Evdev key 代码。使用Evdev时,如果按最左边的主行键,则会得到代码38。

  • 当然,如果跨平台的 key 代码相同,那将太容易了。您可以使用特定于平台的键代码,也可以将其转换为与平台无关的值。我建议使用USB HID代码( pdf)作为与平台无关的代码,因为许多聪明的人已经在协商如何调用每个 key 方面遇到了麻烦。

    我上面发布的库包含每个平台的表,例如 WIN_NATIVE_TO_HID,用于将 key 代码转换为USB HID代码。

    困难的部分是向用户传达他们应该按下什么按钮,但是至少其他国家的人可以玩你的游戏。

    字符码

    您不希望使用字符代码,即使您居住在美国并且您的听众也居住在美国也更容易使用。

    将按钮按下转换为键码后,操作系统随后将键码转换为字符码。字符代码受当前键盘布局的影响,并且通常也受修饰键的影响。

    因此,如果您在键盘上按A,则将根据所使用的平台获得键码65、4或38。但是您将获得字符代码 'a''A',具体取决于Shift键是否按下,或者如果键盘布局设置为法语,则可能会得到 'Q',如果键盘布局设置为俄语,则可能会得到 'Ф'。因此,如果您将WASD编码到游戏中并使用字符代码,则当来自另一个国家的人玩您的游戏时,输入将完全中断。您必须在法国使用ZQSD,在俄罗斯使用ЦФЫВ,很快您就会头疼。

    我本人使用非QWERTY布局(Dvorak),并且大多数游戏完全损坏。在W键的位置,是,如果您按下Shift键,则它变为<,并且某些游戏不能将其识别为同一键。例如,我按前进,但是如果在按住Shift键的同时释放按钮,则游戏会认为我释放了<并认为仍然处于按下状态,所以我会继续向前进。即使我切换到美国键盘布局,大多数使用SDL的游戏对我来说在Mac上都是坏的(我认为这是SDL中的一个小故障)。

    LibSDL

    SDL 2.0提供了独立于平台的键码,称为扫描码。使用 "SDL_scancode.h" header 。 SDL开发人员得出的相同结论是,应将扫描代码转换回USB HID代码,因此SDL扫描代码与我上面发布的库完全兼容(请参阅 keycode.hSDL_scancode.h,数值相同)。

    由于这个和其他原因,如果您使用的是SDL 1.2,我强烈建议您升级到2.0。

    关于c++ - 在C/C++中滚动自己的键盘/输入系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737566/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com