[C++] Game loop met input thread

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 08-10 00:28
Voor een school practicum moet ik een klein spelletje maken dat user input ontvangt via de console met std::cin. Terwijl de gebruiker z'n input geeft moet ondertussen een deel van het spel gewoon door blijven draaien.

Ik heb een game loop waar ik de game continu bijwerk en een losse thread om de input af te handelen. Dit omdat de game anders niet verder gaat totdat de gebruiker z'n input heeft gegeven. Dit werkt goed behalve dan dat de gebruiker maar 1x input kan geven en de game daarna nooit meer nieuwe input vraagt. De code is ongeveer als volgt:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
bool new_input_given //Dirty flag die op true gezet wordt als er nieuwe invoer is.

void handle_input(const char(&board)[BOARD_SIZE][BOARD_SIZE], const player & active_player, const player & other_player) {
    std::cout << "\n" << active_player.name << " make your move like this \"x,y\" and press ENTER or\n";

    std::string input;
    std::cin >> input;

    ... niet relevantie code die kijkt of de invoer geldig is.
    
    if(valid_input) {
        new_input_given = true;
    }
}

int main() {
    ... niet relevante code waar ik de spelers, het spelbord en beginsituatie aanmaak

    std::thread input_thread(handle_input, std::ref(board), std::ref(active_player), std::ref(other_player));
    while (!is_game_finished(board, active_player.symbol)) {
        
        //Dirty flag die kijkt of er nieuwe input is
        if (new_input_given) {
            calculate_board(board);
            draw(board, window);

            //Switches the active player
            if (active_player.name == player1.name) {
                active_player = player2;
                other_player = player1;
            }
            else {
                active_player = player1;
                other_player = player2;
            }

            new_input_given = false;
        }

        //Events voor het gebruikte SFML window
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
        }
        sf::sleep(sf::milliseconds(20));
    }
    std::cout << "game has ended " << active_player.name << " is the winner!\n";
    system("pause");
}


Ik heb al van alles geprobeerd met thread.join() en thread.detach() maar krijg de thread niet zover dat hij blijft vragen om nieuwe input. De game loop zelf blijft wel gewoon actief.

Beste antwoord (via Maarten Kroon op 23-12-2016 12:20)


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 16:17

Rannasha

Does not compute.

Nadat de functie handle_input volledig is uitgevoerd, wordt deze nooit meer gestart. Je zult deze functie opnieuw moeten starten nadat de invoer is afgehandeld, of deze functie middels een loop laten draaien (en eventueel met een tweede flag doorgeven aan de input-functie of de game thread klaar is voor de volgende invoer.

|| Vierkant voor Wiskunde ||

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 16:17

Rannasha

Does not compute.

Nadat de functie handle_input volledig is uitgevoerd, wordt deze nooit meer gestart. Je zult deze functie opnieuw moeten starten nadat de invoer is afgehandeld, of deze functie middels een loop laten draaien (en eventueel met een tweede flag doorgeven aan de input-functie of de game thread klaar is voor de volgende invoer.

|| Vierkant voor Wiskunde ||


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 08-10 00:28
Rannasha schreef op vrijdag 23 december 2016 @ 11:45:
Nadat de functie handle_input volledig is uitgevoerd, wordt deze nooit meer gestart. Je zult deze functie opnieuw moeten starten nadat de invoer is afgehandeld, of deze functie middels een loop laten draaien (en eventueel met een tweede flag doorgeven aan de input-functie of de game thread klaar is voor de volgende invoer.
Je hebt helemaal gelijk, ik had dat zelf over het hoofd gezien. Ik heb nu in de handle_input functie een loop gezet en dit werkt goed. Bedankt voor je hulp!