Использование `sleep()` для временной задержки

Я пытаюсь отложить выполнение программы на 200 мс, а затем проверить, была ли нажата клавиша во время задержки. Как мне это сделать?

Я пытаюсь создать простую компьютерную игру, похожую на Flappy birds, используя C. Я хочу, чтобы у пользователя было немного времени (~ 200 мс), чтобы нажать клавишу, чтобы птица прыгнула, иначе она упадет, но я возникли проблемы с реализацией задержки.

Я читал на некоторых форумах [где?], что sleep(100) должен давать задержку в 100 мс, но когда я это делаю, я получаю 100 секунд.

Я также пытался использовать sleep(1/5), но функция принимает только целые числа.

Кроме того, мне нужно иметь возможность проверить, была ли нажата клавиша в течение 200 мс; Я где-то читал[где?], что для этого можно использовать функцию kbhit, но понятия не имею, как ее использовать.

while(!dead) {
    sleep(200); // what do I put here to get 200ms?

    if (keyWasPressedDuringWait()){ //what do I put here?
        notDeadAnimation():
    }else{
        dead=true;
        deadAimation()
    }
}

person user3371097    schedule 02.03.2014    source источник
comment
stackoverflow.com/questions/4184468/sleep-for-milliseconds   -  person Johnny Mopp    schedule 02.03.2014
comment
Найдите usleep() или nanosleep() (предпочтительнее второй).   -  person MBlanc    schedule 02.03.2014
comment
Попробуйте заснуть. см. man usleep для более подробной информации.   -  person elyashiv    schedule 02.03.2014
comment
Если поиск по запросу khbit не увенчался успехом, попробуйте погуглить по запросу kbhit.   -  person n. 1.8e9-where's-my-share m.    schedule 02.03.2014
comment
На этот вопрос можно было бы ответить самостоятельно, прочитав документацию, предоставленную для вашей реализации стандартной библиотеки, или используя google sleep function c. Это классический RTFM. Если ваша документация хотя бы отдаленно хороша, она будет включать в себя запись See-alse для более мелких функций.   -  person dmckee --- ex-moderator kitten    schedule 02.03.2014


Ответы (2)


Чтобы выполнить желаемую задержку, #include <unistd.h> и используйте usleep(microseconds). (Чтобы заснуть на 200 мс, вызов usleep(200000)).

Чтобы проверить удар по клавиатуре, #include <conio.h> и используйте _kbhit() в своем тесте (сокращение от keyboard hit). _kbhit проверяет наличие ключа в буфере ключей, но не избавляется от него. Вам также нужно использовать _getch для извлечения ключа, удаляя его из буфера ключей. Я бы рекомендовал определить вспомогательную функцию здесь:

int clearKeyBuffer(){
    int count = 0;
    while(_kbhit()){
        _getch();
        count++;
    }
    return count;
}

Этот метод очистит все ключи, которые в данный момент находятся в буфере ключей, и вернет количество очищенных ключей. Затем вы можете использовать это в своем тесте как if(clearKeyBuffer()), чтобы проверить, была ли нажата клавиша с момента последней проверки.

Что касается потока вашей программы, у вас там много лишнего. Вы можете избавиться от большей части этого и при этом оставаться функционально идентичными:

do {
    notDeadAnimation();
    usleep(200000);
} while(clearKeyBuffer());

deadAnimation();

Однако у этого есть очевидная проблема, что кто-то может просто

person AJMansfield    schedule 02.03.2014
comment
Обратите внимание, что conio.h, вероятно, ограничен Windows. - person Vatine; 02.03.2014

Используйте usleep() вместо sleep(). Первый работает за микросекунды. И используйте _kbhit()+getch(), чтобы узнать, была ли нажата клавиша и какая это была клавиша:

while (!dead) {
    usleep(200*1000); // 200 msec

    if (_kbhit()) { // if key was pressed during sleep
        int key = getch();
        // you can check key value here
        notDeadAnimation();
    } else {
        dead = true;
        deadAnimation();
    }
}
person Alexey Polonsky    schedule 02.03.2014