首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PySDL2和SDL_GetKeyboardState

PySDL2和SDL_GetKeyboardState
EN

Stack Overflow用户
提问于 2013-11-07 17:33:09
回答 2查看 1.5K关注 0票数 0

我正在尝试通过PySDL2 (目前的版本为0.7.0;来源 / 文档)来学习SDL。它为C型的所有正常函数提供了一个Pythonic包装器(我假设),并通过它的sdl2.ext包提供了几个Pythonic函数,以处理Python类型中的细节和返回结果。例如,sdl2.ext.get_events()将调用sdl2.SDL_PumpEvents(),然后窥视队列中的所有事件,并将它们作为Python返回。

但是,我不知道SDL_GetKeyboardState()是否存在这样一个方便的函数。函数的官方SDL Wiki文档将其定义为:

代码语言:javascript
运行
复制
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中这是一个粗糙的洗礼,所以我可能会弄坏一些东西:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-08 15:27:26

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

代码语言:javascript
运行
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2015-08-22 18:28:52

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

代码语言:javascript
运行
复制
keystatus = sdl2.SDL_GetKeyboardState(None)
if keystatus[sdl2.SDL_SCANCODE_W]:
    print("the w key was pressed")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19842723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档