【问题标题】:SDL Smoother movement in gameSDL 游戏中更流畅的移动
【发布时间】:2016-01-14 01:09:05
【问题描述】:

我的游戏出了点小问题。

这没什么大不了的,但我很想解决这个问题。

这是我的输入处理函数:

void MainGame::processInput()
{
    SDL_Event evnt;

    while (SDL_PollEvent(&evnt)) {
        switch (evnt.type) {
        case SDL_QUIT:
            _gameState = GameState::EXIT;
            break;

        case SDL_MOUSEMOTION:
            break;

        case SDL_KEYDOWN:
            switch (evnt.key.keysym.sym) {
                case SDLK_RIGHT:
                    player.movePlayer(1);
                    break;

                case SDLK_LEFT:
                    player.movePlayer(2);
                    break;
            }
        }
    }
}

它工作得很好,但正如您可能想象的那样,当我按下箭头键时,它会移动一次(调用一次player.movePlayer(); 函数)然后暂停几分之一秒,然后继续读取输入。

我真的不知道该怎么说,但我希望你知道我的意思。

当你在word中按住任何字母时也可以看到这种效果。

假设您按 W,它将立即显示第一个 W,然后在几分之一秒后显示其余的:

wwwwwwwwwwwwwwwwwwwww

我真的不知道怎么解释。

所以问题是,有没有办法从键盘读取原始输入,以便立即连续调用该函数?

【问题讨论】:

  • 只需自己跟踪 keydown 和 keyup。 wiki.libsdl.org/SDL_GetKeyboardState 你这样做的方式应该主要只用于输入单词的字母,而不是移动控制
  • 通常的方法是记住按键是否按下,然后每一帧,如果按键按下,移动播放器。
  • @xaxxon SDL 根据完全相同的事件设置键盘状态
  • 关键是不要依赖通知,而是根据需要轮询信息是否已关闭

标签: c++ sdl


【解决方案1】:

我经常使用这样的代码:

bool keyboard[1<<30]; // EDIT: as noted in the comments this code might not be the most efficient

在事件循环中

while (SDL_PollEvent(&evnt)) {
    switch (evnt.type) {
    case SDL_QUIT:
        _gameState = GameState::EXIT;
        break;

    case SDL_MOUSEMOTION:
        break;

    case SDL_KEYDOWN:
        keyboard[evnt.key.keysym.sym] = true;
        break;
    case SDL_KEYUP:
        keyboard[evnt.key.keysym.sym] = false;
        break;
    }
    step();
}

和阶跃函数:

void step() {
  if(keyboard[SDLK_RIGHT]) player.movePlayer(1);
  else if(keyboard[SDLK_LEFT]) player.movePlayer(2);
}

【讨论】:

  • 您确实意识到bool keyboard[1&lt;&lt;30] 将消耗至少 2^30 字节 (1GiB) 的内存?
  • bool[1&lt;&lt;30] 至少占用 1c++ - Why is a boolean 1 byte and not 1 bit of size? - Stack Overflow。但是有 std::vector 作为替代方案;而在 Linux 上,如果动态分配它可能不会占用那么多 (virtual memory)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多