Как установить ограничение по времени для ввода пользователя? - PullRequest
0 голосов
/ 06 марта 2012

Я пробовал различные настройки с вводом и таймером на одну секунду, но ничего не работает.Весь код останавливается, когда достигает части, требующей ввода.У меня есть небуферизованный поток, поэтому мне не нужно нажимать ввод для отправки ввода.Также целью этого является игра pac-man, которую я разрабатываю для использования в терминалах.То, что я хочу, это в основном иметь интервал в одну секунду, когда пользователь может ввести команду.Если команда не введена, я хочу, чтобы упаковщик продолжал движение в том же направлении, в котором он двигался в последний раз при вводе команды.

РЕДАКТИРОВАТЬ:

time_t startTime, curTime;

    time(&startTime);
    do
    {
        input=getchar();
        time(&curTime);
    } while((curTime - startTime) < 1);

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Вы можете попробовать использовать alarm() (или аналогичную функцию таймера), чтобы бросить и заставить ваше приложение ловить SIGALRM, хотя для PacMac это определенно излишне. Рассмотрите возможность использования отдельного потока (потока POSIX) для управления таймером.

1 голос
/ 06 марта 2012

В Unix вы можете просто использовать select или poll с таймаутом для стандартного дескриптора входного файла (STDIN_FILENO или fileno (stdin)). Я бы не стал вводить мышиные ловушки, построенные из сигналов и потоков, только для этого.

0 голосов
/ 06 марта 2012

Мое чувство кишки говорит мне это:

  • Один поток, предназначенный для обработки ввода пользователя и помещения ключевых событий в очередь
  • Поток, активированный таймером, при каждой активации потребляет все ключевые события в очереди, используя тот, который произошел в последний раз, в момент активации потока.

Убедитесь, что ваш доступ к очереди синхронизирован.

// I/O Thread:
while (!stop) {
    input = getchar();
    lock_queue();
    queue.push_back(input);
    unlock_queue();
}

// Timer Thread:
while (!stop) {
    lock_queue();
    if (queue.size() == 0) {
        action = DEFAULT_ACTION;
    } else {
        // either handle multiple key events somehow
        // or use the last key event:
        action = queue.back();
        queue.clear();
    }
    unlock_queue();
    perform_action(action);
    sleep();
}

Полный пример опубликован как Github Gist .

0 голосов
/ 06 марта 2012

Вы можете использовать неблокирующую функцию ввода, такую ​​как getch (), но она не очень кроссплатформенна.

В идеале вы должны использовать события для обновления состояния игры, в зависимости от того, какую ОС вы используете.Вы можете использовать события ОС для нажатия клавиш или, например, библиотеку, такую ​​как SDL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...