0

I'm trying to use ncurses to create a game. I set it so that the character moves by arrow key input, but if I hold the arrow key for a while and then let go the character will keep moving for a while before stopping.

These are my initializations:

initscr();
start_color();
cbreak();
noecho();
nodelay(stdscr,TRUE);
keypad(stdscr, TRUE);

This is my main loop:

while(1) {
    ...

    if (key == (char)27) {
        break;          
    }
    else if (key == KEY_DOWN) {
        key = 0;
        player->advance(0, 1);
    }
    else if (key == KEY_UP) {
        key = 0;
        player->advance(0, -1);
    }
    else if (key == KEY_LEFT) {
        key = 0;
        player->advance(-1, 0);
    }
    else if (key == KEY_RIGHT) {
        key = 0;
        player->advance(1, 0);
    }
    else {
        key = getch();
    }

    std::this_thread::sleep_for(std::chrono::milliseconds {1000/30});
}

I'm using the sleep_for because I noticed that if I use timeout then the framrate changes if I'm pressing a key. Using sleep_for creates a consistent framerate, but input is somehow "sticky" as I explained. I need to fix this somehow. Either get a consistent framrate using timeout, or "un-stick" the input when using sleep_for.

player->advance(int, int) moves the player one step in the specified direction. Direction is specified as change in x and change in y to be applied to the current position.

yman
  • 41
  • 4

1 Answers1

0

You could call flushinp after each call on getch, to ignore type-ahead.

Thomas Dickey
  • 51,086
  • 7
  • 70
  • 105