【发布时间】:2013-11-07 17:33:09
【问题描述】:
我正在尝试通过 PySDL2(当前版本 0.7.0;source / documentation)学习 SDL。它为(我假设)所有 SDL 的普通函数提供了一个 ctypes Python 包装器,并通过其 sdl2.ext 包提供了更多 Pythonic 函数来处理细节并以 Python 类型返回结果。例如,sdl2.ext.get_events() 将调用sdl2.SDL_PumpEvents(),然后查看队列中的所有事件并将它们作为 Python 列表返回。
但是,我无法确定SDL_GetKeyboardState() 是否存在这样的便利功能。该函数的官方SDL Wiki documentation将其定义为:
const Uint8* SDL_GetKeyboardState(int* numkeys)
其中 numkeys 可能为 null(否则它将接收返回数组的长度),返回的 Uint8* 是指向键状态数组的指针,由 SDL_Scancode 值索引,如果键按下或将保持 1 0 如果它已启动。
PySDL2 确实通过sdl2.keyboard.SDL_GetKeyboardState(numkeys) 提供了对 SDL_GetKeyboardState 的直接调用,但返回的 ctypes 值不会立即有用。
所以我的问题是,是否有更多 Pythonic 函数可以通过 PySDL2 获取当前 SDL 键盘状态?如果有,它是什么以及应该如何使用?如果没有,是否应该提交一份?
作为参考,我想我自己想出了如何实现这个功能,但这是对 ctypes 的粗略洗礼,所以我可能弄错了一些东西:
import ctypes
import sdl2
KEYBOARD_ARRAY_TYPE = ctypes.c_uint8 * sdl2.SDL_NUM_SCANCODES
def get_keyboard_state():
""" Returns a pointer to the current SDL keyboard state,
which is updated on SDL_PumpEvents. """
raw_keystate = sdl2.keyboard.SDL_GetKeyboardState(None)
pointer = ctypes.cast(raw_keystate, ctypes.POINTER(KEYBOARD_ARRAY_TYPE))
return pointer.contents
【问题讨论】:
-
您可以自己通过下载 SDL 的源代码并搜索“GetKeyboardState”来确定这一点。无论如何,在许多情况下,使用
GetEvents()并自己跟踪键盘状态比使用GetKeyboardState()更有帮助。您经常试图确定某个键被按下。反复查询键盘状态意味着您需要确保查询速度足够快,以免错过按键。 -
我最初检查了按键,但是当我想要按住按钮时,这导致了不稳定的行为。就像在尝试将精灵向右移动时,我可以观察到我的 Windows 重复率开始发挥作用。这似乎并没有同时向下和向右重复。我同意知道某个键是否被按下(或释放)通常很重要,但有时人们还想知道哪些键当前处于关闭状态。我会看看我能做些什么来获取源代码;我什至没有想到,因为我总是找不到我链接的 Bitbucket 网站。
标签: python keyboard ctypes sdl-2 pysdl2