SDL在游戏中更流畅的运动

时间:2016-01-14 01:09:05

标签: c++ sdl

我的游戏遇到了一个小问题。

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

所以这是我的输入处理功能:

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();函数一次)然后暂停几分之一秒然后继续读取输入

我真的不知道如何说出来,但我希望你知道我的意思。

当您在单词中保留任何字母时,您也可以看到此效果。

假设您按 W ,它会立即显示第一个W,然后在一小段时间之后显示剩余的那个:

   w wwwwwwwwwwwwwwwwwwwww

我真的不知道如何解释它。

所以问题是,有没有办法从键盘读取原始输入,所以该功能将被立即连续调用?

1 个答案:

答案 0 :(得分:0)

我经常使用这样的代码:

bool keyboard[1<<30];

并在事件循环中

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);
}