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:
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.
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.