Как получить поток ввода во время выполнения другого цикла while в С++

Я пишу игру на С++, которая использует pdcurses для получения ввода от пользователя и отображения постоянно меняющегося статуса игрока. на терминале командной строки. Я использую цикл while для непрерывного обновления состояния здоровья игрока (числовое значение), которое выводится на экран с небольшой строкой состояния. Он повторяется несколько раз в секунду, что придает игре ощущение реального времени. Пока программа работает, я хочу, чтобы это значение постоянно обновлялось, даже если я взаимодействую с игрой. Например, я хочу отдать команду «есть еду» или «рубить дрова», не прерывая мой небольшой цикл отображения состояния. У меня возникли проблемы с проектированием функциональности этой части. Как мне обновлять свой статус, пока я взаимодействую с игрой? Я обеспокоен тем, что пока пользователь вводит что-то в терминал, цикл while приостанавливается, и статус больше не продолжает обновляться. Я ищу некоторые общие указатели больше, чем фактический код. Я очень ценю это. Я довольно новичок в программировании.

Должен ли я использовать несколько потоков или есть способ, чтобы цикл while продолжал работать, пока пользователь вводит текст на экран? Спасибо за любые указания, которые вы можете дать. Я надеюсь, что это не слишком запутанный вопрос.

FWIW, вот псевдокод, который у меня есть:

#include //....some files....
int main() {

// Initialize game objects and graphics
bool programRunning = true;
float playerEnergy = 3000.0;

initscr();          /* Start curses mode          */
while (programRunning)
{
    // Display some graphics
    // Display playerEnergy
    // Set the while loop speed using std::this_thread::sleep_for...
    playerEnergy -= 0.01;

    int ch;
    ch = getch();

    switch (ch) {
        case 'e':  //eat food
            playerEnergy += 1000;
            // Do some stuff
            break;
        case 'w':  //do some work
            playerEnergy -= 1000;
            // Do some stuff
            break;

        /* Etc, Etc.  */

        default:
            break;
        }

    // If player quits, set programRunning to false
}

endwin();           /* End curses mode        */
return 0;

}


person JasonArg123    schedule 14.10.2015    source источник


Ответы (2)


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

Я видел здесь что использование getch может решить вашу проблему, если вы сделаете его неблокирующим вызовом, используя: nodelay(stdscr,TRUE); но я сам не использовал это

person CIsForCookies    schedule 14.10.2015
comment
Спасибо! Я искал, прежде чем задать вопрос, но, очевидно, пропустил тот, который задавал почти то же самое. ваше здоровье - person JasonArg123; 14.10.2015

Это зависит от того, что вы делаете, но я обычно предпочитаю halfdelay() — он позволяет вам иметь неблокирующий ввод, не привязывая ЦП к 100%. В качестве альтернативы вы можете использовать nodelay() и вручную вызвать napms(), когда это необходимо.

person William McBrine    schedule 15.10.2015