2017-01-15 20 views
0

Я пытаюсь использовать ncurses для создания игры. Я установил его так, чтобы символ перемещался с помощью клавиши со стрелкой, но если я удерживаю клавишу со стрелкой некоторое время, а затем отпускаю, символ будет продолжать двигаться некоторое время, прежде чем останавливаться.NCURSES ввод клавиатуры во время вызова сна

Это моя инициализация:

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

Это мой главный цикл:

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

Я использую sleep_for, потому что я заметил, что если я использую тайм-аут, то изменения framrate если я m нажмите клавишу. Использование sleep_for создает согласованную частоту кадров, но вход как-то «липкий», как я объяснил. Мне нужно как-то это исправить. Либо получить согласованную рамку с использованием тайм-аута, либо «отключить» ввод при использовании sleep_for.

player-> advance (int, int) перемещает игрока на один шаг в указанном направлении. Направление определяется как изменение x и изменение y для применения к текущей позиции.

+0

Пожалуйста, добавьте правильный тег для используемого вами языка. Он выглядит как [tag: C++]. – usr2564301

ответ

0

Вы можете позвонить по телефону flushinp после каждого звонка по телефону getch, чтобы игнорировать тип-вперед.

+0

Спасибо. Кажется, это трюк. – yman