gpt4 book ai didi

c - GLUT 跟踪按下的键(当按下 SHIFT 键并在没有它的情况下释放时)

转载 作者:太空狗 更新时间:2023-10-29 12:31:05 24 4
gpt4 key购买 nike

我正在尝试跟踪按下的键。我有 glutIgnoreKeyRepeat(1) 并且我在一个对象中注册键事件(正常和特殊的向下/向上),该对象跟踪按下的键(从现在开始称为按下键列表)所以如果通过查看该列表按下某个键,我只是检查我的显示功能。

问题SHIFT有关:不同的键注册为DOWN和UP(取决于是否按下SHIFT)对于相同的物理键盘键(例如aA1![{ 等)

考虑这个(用 {key1 key2} 代表我在事件后按下的键列表):

  • 初始状态:{}没有键被列为已按下
  • SHIFT 向下:{SHIFT}
  • a DOWN : {SHIFT A}(因为 SHIFT 仍然向下,大写字母“A”寄存器作为下键。
  • SHIFT 向上:{A}
  • a UP: {A}(因为 SHIFT 没有被按下,降低 'a' 注册为键向上,所以 a 从按下的键列表中删除(实际上不存在), A 仍然存在)
  • 最终状态:{A},即使键盘上没有任何键被按下。

对于字母键,我可以通过添加/删除键的小写字母(a 而不是 A)来解决这个问题。

但是 1![{ 呢? glutGetModifiers 在这里没有帮助。或者,如果按下一个键,窗口失去焦点,释放键后窗口再次获得焦点怎么办(没有事件表明窗口失去焦点时键被释放)?

是否有通用的解决方案来检查是否按下了某个键? (依赖于平台的解决方案没问题,另一个库不适合我,但也许适合需要解决这个问题的其他人)

最佳答案

您需要的是键码,即在键盘上按下的键的物理编号。这些在 Apple 和 PC 键盘上是不同的,在其他国家/地区的键盘上也可能不同,因为字母会改变位置。

大多数程序不关心键码,它们需要实际的字母和修饰键,因此系统事件处理程序提供从键码到预期字符/特殊键的转换。 GLUT 旨在简单、便携和跨平台,因此使用这些例程。

如果您正在编写游戏或模拟器,将所有内容小写可能就足够了。对于那种高速交互,大多数玩家不会想要区分 1 和 !,或者 2 和 @。 Ins/Del 和箭头键 block (通常)无论如何都没有多个符号,而且数字小键盘离大多数人来说太远而无法同时按住修改键。

如果您真的非常需要跟踪每个关键状态,抱歉 GLUT 不适合您。在 MacOS 上,您向 NSKeyEvent 询问键码,在 MS Windows 上,您使用 DirectX,在 Linux 上,您使用 XKeyPress|ReleaseEvent 键码。

希望这对您有所帮助。

关于c - GLUT 跟踪按下的键(当按下 SHIFT 键并在没有它的情况下释放时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26972465/

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