如何在 SDL2 C++ 中获取持久输入
How to get persistent input in SDL2 c++
所以我注意到,当使用 SDL_GetKeyboardState(NULL)
进行输入时,当按住特定按钮时,它会首先写入 outlets say a
,然后在 1 秒后它会继续 aaaaaaaa
通常情况下。我想当我按住按钮 a 时它会自动变为 aaaaaa
。
如果您不理解我糟糕的解释,请观看以下视频:
https://streamable.com/oub0w3
先写出a
和写出aaaaa
之间有一个延迟大约1秒。我该如何改变它? (我希望没有延迟)
这是我的代码:
while (gameRunning) {
SDL_Event event;
const Uint8* keystates = SDL_GetKeyboardState(NULL);
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
gameRunning = false;
}
if (keystates[SDL_SCANCODE_W]) {
entities[0].setY(entities[0].getY() - 1);
}
if (keystates[SDL_SCANCODE_S]) {
entities[0].setY(entities[0].getY() + 1);
}
if (keystates[SDL_SCANCODE_A]) {
entities[0].setX(entities[0].getX() - 1);
}
if (keystates[SDL_SCANCODE_D]) {
entities[0].setX(entities[0].getX() + 1);
}
}
您在滥用 SDL_GetKeyboardState(nullptr)
。
应该在主循环中使用,而不是在事件循环中使用:
while (gameRunning)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
gameRunning = false;
}
const std::uint8_t *keystates = SDL_GetKeyboardState(nullptr);
if (keystates[SDL_SCANCODE_W])
entities[0].setY(entities[0].getY() - 1);
if (keystates[SDL_SCANCODE_S])
entities[0].setY(entities[0].getY() + 1);
// An so on...
}
如果您希望立即开始重复,您需要自己实现重复字母。
您作为事件收到的额外“a”字符(我假设)是由操作系统生成的,因此除非您在 OS 上进行了一些设置,否则您可以更改为立即开始重复,您需要你的程序来做。
(我假设 SDL 不是生成这些字符的那个,这可能是一种可能性)
为此,您需要让系统检查经过的时间并跟踪按下按键的时间,并输出它自己生成的“按键”事件,就像 OS正在做。
所以我注意到,当使用 SDL_GetKeyboardState(NULL)
进行输入时,当按住特定按钮时,它会首先写入 outlets say a
,然后在 1 秒后它会继续 aaaaaaaa
通常情况下。我想当我按住按钮 a 时它会自动变为 aaaaaa
。
如果您不理解我糟糕的解释,请观看以下视频:
https://streamable.com/oub0w3
先写出a
和写出aaaaa
之间有一个延迟大约1秒。我该如何改变它? (我希望没有延迟)
这是我的代码:
while (gameRunning) {
SDL_Event event;
const Uint8* keystates = SDL_GetKeyboardState(NULL);
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
gameRunning = false;
}
if (keystates[SDL_SCANCODE_W]) {
entities[0].setY(entities[0].getY() - 1);
}
if (keystates[SDL_SCANCODE_S]) {
entities[0].setY(entities[0].getY() + 1);
}
if (keystates[SDL_SCANCODE_A]) {
entities[0].setX(entities[0].getX() - 1);
}
if (keystates[SDL_SCANCODE_D]) {
entities[0].setX(entities[0].getX() + 1);
}
}
您在滥用 SDL_GetKeyboardState(nullptr)
。
应该在主循环中使用,而不是在事件循环中使用:
while (gameRunning)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
gameRunning = false;
}
const std::uint8_t *keystates = SDL_GetKeyboardState(nullptr);
if (keystates[SDL_SCANCODE_W])
entities[0].setY(entities[0].getY() - 1);
if (keystates[SDL_SCANCODE_S])
entities[0].setY(entities[0].getY() + 1);
// An so on...
}
如果您希望立即开始重复,您需要自己实现重复字母。
您作为事件收到的额外“a”字符(我假设)是由操作系统生成的,因此除非您在 OS 上进行了一些设置,否则您可以更改为立即开始重复,您需要你的程序来做。
(我假设 SDL 不是生成这些字符的那个,这可能是一种可能性)
为此,您需要让系统检查经过的时间并跟踪按下按键的时间,并输出它自己生成的“按键”事件,就像 OS正在做。