PySDL2和SDL\GetKeyboard

2024-05-19 08:11:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过PySDL2(当前版本为0.7.0;source/documentation)学习SDL。它为SDL的所有正常函数提供了一个ctypesPython包装器,并通过其sdl2.ext包提供了更多的Python函数来处理细节并以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的一次粗略的洗礼,所以我可能弄错了一些东西:

^{pr2}$

Tags: 函数版本source状态documentation数组ctypesext
2条回答

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

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

下面是一个使用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]

相关问题 更多 >

    热门问题