我正在尝试通过PySDL2 (目前的版本为0.7.0;来源 / 文档)来学习SDL。它为C型的所有正常函数提供了一个Pythonic包装器(我假设),并通过它的sdl2.ext包提供了几个Pythonic函数,以处理Python类型中的细节和返回结果。例如,sdl2.ext.get_events()将调用sdl2.SDL_PumpEvents(),然后窥视队列中的所有事件,并将它们作为Python返回。
但是,我不知道SDL_GetKeyboardState()是否存在这样一个方便的函数。函数的官方SDL Wiki文档将其定义为:
const Uint8* SDL_GetKeyboardState(int* numkeys)其中,数字键可能为null (否则它将接收返回数组的长度),而返回的Uint8 8*是一个指向键状态数组的指针,该数组由SDL_Scancode值索引,如果键向下,则包含1,如果键打开,则包含0。
PySDL2确实通过sdl2.keyboard.SDL_GetKeyboardState(numkeys)提供了对SDL_GetKeyboardState的直接调用,但它返回一个不立即有用的ctype值。
所以我的问题是,是否还有更多的Pythonic函数来通过PySDL2获得当前的SDL键盘状态?如果有的话,它是什么,它应该如何使用?如果没有,应该提交一个吗?
作为参考,我想我自己已经想出了如何实现这一功能,但在ctype中这是一个粗糙的洗礼,所以我可能会弄坏一些东西:
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发布于 2013-11-08 15:27:26
下面是一个使用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]发布于 2015-08-22 18:28:52
有一个更简单的解决方案不需要导入ctypes
keystatus = sdl2.SDL_GetKeyboardState(None)
if keystatus[sdl2.SDL_SCANCODE_W]:
    print("the w key was pressed")https://stackoverflow.com/questions/19842723
复制相似问题