SDL Smoother movement in game

試著忘記壹切 提交于 2021-01-28 12:09:24

问题


I have got a small problem with my game.

It is not a big deal but I'd love to sort this out.

So this is my input processing function:

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

and it works just fine, but as you can probably imagine, when I press an arrow key, it moves once (calls the player.movePlayer(); function once) then pauses for a fraction of a second and then continues to read input.

I don't really know how to word it but I hope you know what I mean.

You can also see this effect when you hold any letter in word.

Let's say you press W, it will display the first W instantly and then remaining ones after a fraction of a second something like that:

w wwwwwwwwwwwwwwwwwwwww

I really don't know how to explain it.

So the question is, is there a way to read the raw input from the keyboard so the function will be called continuously straight away?


回答1:


I often use code like this:

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

and in the event loop

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

and the step function:

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


来源:https://stackoverflow.com/questions/34780013/sdl-smoother-movement-in-game

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!