gpt4 book ai didi

input - 使用SDL从键盘读取输入的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 03:22:29 25 4
gpt4 key购买 nike

我每秒运行n次update()方法以“更新”用户的键盘输入,以便稍后可以在程序的逻辑部分中读取它。因此,我在SDL Docs中找到了两种实现此方法的方法,我不确定应该使用哪种方法。

1;使用SDL_PollEvent搜索所有事件以循环搜索所有按键按下/按下事件,并将按键状态保存在映射中,这样我就可以检查程序逻辑中的每个按键状态。

注意:另外,我也可以使用SDL_PeepEvents而不是SDL_PollEvent来仅处理重要的事件类型。因此,它不会“扔掉”队列中的事件。

std::map<int, bool> keyboard; // Saves the state(true=pressed; false=released) of each SDL_Key.

void update()
{
SDL_Event event;
while( SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
keyboard[event.key.keysym.sym] = false;
break;
case SDL_KEYUP:
keyboard[event.key.keysym.sym] = true;
break;
}
}
}

2;每帧从键盘拍摄快照,以便我轻松阅读。
Uint8* keyboard;

void update()
{
SDL_PumpEvents();
keyboard = SDL_GetKeyState(NULL);
}

通过以上任何一种实现,我都可以像下面这样读取 keyboard:
if (key_map[SDLK_Return]) printf("Return has been pressed.");

另外,还有其他方法吗?

最佳答案

我更喜欢做1的变体,在其中填充三个数组,不仅指示当前状态,而且指示哪些键刚刚按下,哪些键刚刚按下。这使我可以轻松地在代码中检查那些事件(无需与以前的快照进行比较),但是最重要的是,它不会错过持续时间少于一帧的事件。例如,如果您的游戏由于机器速度慢而以10 fps的速度运行,则用户可能在两次更新例程调用之间按下并释放了一个重要的键,然后您的系统将永远不会注册它。这是非常令人沮丧的。

当按下键时,SDL还发送键事件,这使您可以在每次按下键时具有多个键按下事件。当实现通过项目列表的键盘滚动时,我发现这特别有用。键盘控制的菜单。

关于input - 使用SDL从键盘读取输入的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com