PySDL2 and SDL_GetKeyboardState



我正在尝试通过 PySDL2(当前版本 0.7.0;源代码/文档)学习 SDL。它为(我假设)SDL 的所有正常函数提供了一个 ctypes Python 包装器,并通过其 sdl2.ext 包提供了更多的 Pythonic 函数来处理细节并返回 Python 类型的结果。例如,sdl2.ext.get_events()将调用 sdl2.SDL_PumpEvents() ,然后查看队列上的所有事件并将它们作为 Python 列表返回。

但是,我无法判断SDL_GetKeyboardState()是否存在这样的便利功能。该函数的官方 SDL Wiki 文档将其定义为:

const Uint8* SDL_GetKeyboardState(int* numkeys)

其中 numkey 可能为 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

下面是一个使用 numkeys 而不是常量SDL_NUM_SCANCODES的修改:

import ctypes
import sdl2
def get_keyboard_state():
    """ Returns a list with the current SDL keyboard state,
    which is updated on SDL_PumpEvents. """
    numkeys = ctypes.c_int()
    keystate = sdl2.keyboard.SDL_GetKeyboardState(ctypes.byref(numkeys))
    ptr_t = ctypes.POINTER(ctypes.c_uint8 * numkeys.value)        
    return ctypes.cast(keystate, ptr_t)[0]

有一个更简单的解决方案,不需要导入ctypes

keystatus = sdl2.SDL_GetKeyboardState(None)
if keystatus[sdl2.SDL_SCANCODE_W]:
    print("the w key was pressed")

相关内容

  • 没有找到相关文章

最新更新