SDL2-CS中GetKeyboardState获取按键状态始终返回0的问题求助
SDL2-CS中GetKeyboardState返回0的问题排查与修复
嘿,我之前也碰到过类似的坑!你这段代码的问题其实出在对SDL_GetKeyboardState返回值的理解上,咱们一步步捋清楚:
你的代码核心错误
你完全搞反了数组索引和元素的含义:SDL_GetKeyboardState返回的字节数组,索引对应扫描码的数值,而数组里的元素值才是按键的状态——1表示按键按下,0表示松开。你现在是把数组元素和扫描码做对比,这根本不是判断按键是否按下的正确逻辑;而且循环里每次都覆盖isKeyPressed,最后只会检查最后一个数组元素,这肯定得不到正确结果。
修复后的代码
Unsafe代码版本(更高效)
直接用扫描码作为索引去取数组里的状态值就行,不用遍历整个数组:
public bool GetKey(SDL.SDL_Keycode _keycode) { int arraySize; var scancode = SDL.SDL_GetScancodeFromKey(_keycode); unsafe { byte* keyState = (byte*)SDL.SDL_GetKeyboardState(out arraySize); // 先判断扫描码是否在有效范围内,避免数组越界 if (scancode >= 0 && scancode < arraySize) { return keyState[scancode] == 1; } } return false; }
安全代码版本(无需Unsafe)
如果你不想用unsafe代码,也可以用Marshal.Copy把SDL返回的指针复制到自己的字节数组里再判断:
using System.Runtime.InteropServices; public bool GetKey(SDL.SDL_Keycode _keycode) { int arraySize; IntPtr keyStatePtr = SDL.SDL_GetKeyboardState(out arraySize); byte[] keyStateArray = new byte[arraySize]; Marshal.Copy(keyStatePtr, keyStateArray, 0, arraySize); var scancode = SDL.SDL_GetScancodeFromKey(_keycode); if (scancode >= 0 && scancode < arraySize) { return keyStateArray[scancode] == 1; } return false; }
额外注意事项
- 一定要确保你在调用这个方法前,已经处理了SDL的事件循环(比如调用
SDL_PollEvent或者SDL_WaitEvent),不然SDL可能不会更新键盘状态,导致你拿到的还是旧的、不正确的数值。 SDL_GetKeyboardState返回的指针是SDL内部管理的内存,不需要你手动释放;如果不需要长期保存键盘状态,用unsafe版本会更高效,没必要复制数组。
内容的提问来源于stack exchange,提问作者Nighko
相关产品推荐
相关产品推荐

