0

PySDL2 (現在のバージョンは 0.7.0; source / documentation ) 経由で 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)

ここで、numkeys は null の場合があり (それ以外の場合は、返された配列の長さを受け取る)、返された Uint8* は、SDL_Scancode 値でインデックス付けされたキー状態の配列へのポインターであり、キーが押されている場合は 1、押されている場合は 0 を保持します。です。

PySDL2 は を介し​​て SDL_GetKeyboardState を直接呼び出しsdl2.keyboard.SDL_GetKeyboardState(numkeys)ますが、すぐには役に立たない ctypes 値を返します。

だから私の質問は、PySDL2 を介して現在の SDL キーボードの状態を取得するための Pythonic 関数が他にありますか? 存在する場合、それは何で、どのように使用する必要がありますか? ない場合は、提出する必要がありますか?

参考までに、私はこの機能を自分で実現する方法を考え出したと思いますが、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
4

2 に答える 2

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]
于 2013-11-08T15:27:26.110 に答える