【问题标题】:Best way to detect key presses without SDL or GLUT?在没有 SDL 或 GLUT 的情况下检测按键的最佳方法?
【发布时间】:2011-10-13 19:58:15
【问题描述】:

我最近通过 C++ 使用 OpenGL 和 GLUT 创建了一个小型应用程序。 一切都很好,然后我用帧率等实现了一个适当的游戏循环,这让很多事情变得更好,但它似乎也打破了常规的 GLUT 键盘检测(无论如何这对于游戏键盘输入来说似乎从来都不是很好) - 所以现在我正在我的应用程序中寻找另一种键盘输入方法。

任何人都可以提出任何其他(最好是相对简单的)检测应用程序中的关键输入的方法吗?

【问题讨论】:

  • 如果您使用的是内置操作系统 API,我们需要知道您使用的是什么操作系统(我猜是 Windows?)否则您可以尝试另一个轻量级库,例如 GLFW。
  • 不是我喜欢 GLUT,但是为什么你说 glut 键盘输入不好呢? GLUT 有两种键盘输入模式。一个就像在文本编辑器中一样,如果你一直按一个键,你会定期收到它。另一种方法(用于游戏)是在按键被按下(因此您更改游戏状态)和释放时(因此您将状态更改回来)通知您。第二种方法非常适合游戏。顺便说一句,第二种方法也适用于 SDL。我用它写了很多游戏,它们都很好用。
  • @Shahbaz,很抱歉提到旧的评论和帖子,但是 freeglut 甚至有几个多年来没有解决的错误,例如按下 ctrl + 数字时甚至不会触发键盘回调,没有特殊键盘回调.您无法区分 ctrl-break 和 ctrl -c 因为它们被报告为相同的 ascii 字符...... glut is 中的键盘处理不好。还有其他错误,仅在 Windows 上...sourceforge.net/p/freeglut/bugs

标签: c++ input keyboard


【解决方案1】:

所以现在我正在我的应用程序中寻找一种不错的键盘输入方法。

不,您正在考虑不再使用 GLUT。

至少在 Windows 上,您获取输入的能力直接与您的窗口相关联。如果你没有某种窗口,你就没有输入(控制台本身就是一个窗口)。更重要的是,如果 GLUT 拥有您的窗口,那么 GLUT 会决定如何处理来自该窗口的输入。

因此,如果您使用 GLUT,则必须使用 GLUT 的输入系统。如果 GLUT 的输入系统不足以满足您的需求,那么是时候放弃 GLUT 以寻求更绿色的牧场了。毕竟,GLUT 是为演示而设计的,而不是严肃的应用程序。

因此,您需要更换 GLUT 为您提供的所有功能。您可能可以使用GLFW 逃脱,但这对于您的游戏来说可能还不够。因此,SDLSFMLAllegro 5 都是可能的。他们有产生使用 OpenGL 的窗口的方法,而且它们都是跨平台的。它们都拥有比 GLUT 更有效、更灵活的输入系统。

【讨论】:

  • 我想我会从 GLUT 切换到 SDL,然后希望它就像在包含 SDL.h 后更改几行一样简单
【解决方案2】:

没有简单的方法。如果您想从操作系统输入,则需要跟踪 Windows 消息,如果您使用 GLUT,则不会发生这种情况,因为它会为您创建窗口。 GLUT 的另一个坏处是它并没有真正跟踪按下的键,而是输入的字符,所以按 num1 和 num1+shift 会生成 2 个不同的东西,并且对于每个键盘布局,这些都是不同的。如果您想正确处理键盘,请使用 SDL 或更好的 SFML(谷歌为它 - 简单快速的多媒体库)。这些允许您跟踪按键。或者,如果您不想为此使用任何库,则需要自己创建和处理窗口,除非您为每个平台制作该代码,否则它不会是可移植的。即使您不想要便携,使用 win32 编程也很痛苦,您肯定不想这样做。

GLUT 根本不是为游戏而设计的,没有其他内容,我的建议是使用 SFML。

更新: 如果你真的想弄乱win32(操作系统Windows案例),假设你知道如何创建和处理你的窗口,Windows发送给窗口的消息是WM_KEYDOWN,按下的键标识符存储为wParam。在这里您可以找到所有可能的值virtual keycodes

【讨论】:

    【解决方案3】:

    OIS。食人魔人有一些documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2017-07-27
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2011-10-03
      • 2021-08-27
      相关资源
      最近更新 更多