многопоточность — как получить поток ввода во время выполнения другого цикла while в Stack Overflow

Я пишу игру на C ++, которая использует 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;

}

2

Решение

Как вы и предполагали, я бы хотел использовать несколько тем.

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

2

Другие решения

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

1

По вопросам рекламы [email protected]