Как да получа въвеждане на поток по време на изпълнение на друг цикъл while в c++

Пиша игра на c++, която използва pdcurses, за да получи информация от потребителя и да покаже постоянно променящото се състояние на играча на терминала на командния ред. Използвам цикъл 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