PySDL2和SDL_GetKeyboardState

时间:2013-11-07 17:33:09

标签: python keyboard ctypes sdl-2 pysdl2

我正在尝试通过PySDL2学习SDL(目前版本为0.7.0; source / documentation)。它提供了一个ctypes Python包装器(我假设)所有SDL的普通函数,它通过其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

2 个答案:

答案 0 :(得分:1)

以下是使用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]

答案 1 :(得分:0)

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

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