问题描述
我在项目中使用SDL2,并在使用C#绑定。我正在尝试从GetKeyboardState()
函数中获取键扫描代码的UInt8 / Byte数组。但是,无论何时尝试,它只会返回0。
我想知道其他人是否也有类似的经历,或者您是否知道我的代码有什么问题?
该数组作为IntPtr返回,因此是不安全的代码。 (我不确定是否应该使用Marshal.copy()
函数)
public bool GetKey(SDL.SDL_Keycode _keycode)
{
int arraySize;
bool isKeypressed = false;
byte keycode = (byte)SDL.SDL_GetScancodeFromKey(_keycode);
bool found = false;
unsafe
{
var KeyState = (byte*) SDL.SDL_GetKeyboardState(out arraySize);
for (int i = 0; i < arraySize; ++i)
{
isKeypressed = KeyState[i] == keycode;
}
}
return isKeypressed;
}
对于不知道SDL2-CS是什么或SDL2是什么,但仍想帮助的人,以下是相关链接:
https://github.com/flibitijibibo/SDL2-CS
解决方法
感谢汉斯·帕森特。
由于任何原因,C#放入布尔值时都不等于1,所以我不得不将语句扩展一点。
工作代码:
public bool GetKey(SDL.SDL_Keycode _keycode)
{
int arraySize;
bool isKeyPressed = false;
IntPtr origArray = SDL.SDL_GetKeyboardState(out arraySize);
byte[] keys = new byte[arraySize];
byte keycode = (byte) SDL.SDL_GetScancodeFromKey(_keycode);
Marshal.Copy(origArray,keys,arraySize);
isKeyPressed = keys[keycode] == 1;
return isKeyPressed;
}
为了消除对不安全代码的需求,我使用了Marshal.Copy()
函数。