Я пишу игру на 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;
}
Как вы и предполагали, я бы хотел использовать несколько тем.
Я видел Вот что с помощью getch
может решить вашу проблему, если вы сделаете это неблокирующим вызовом, используя: nodelay(stdscr,TRUE);
но я не использовал это сам
Это зависит от того, что вы делаете, но я обычно одобряю halfdelay()
— это позволяет вам иметь неблокирующий ввод без привязки процессора на 100%. Кроме того, вы можете использовать nodelay()
и вручную позвонить napms()
когда уместно.