Mettre le jeu en pause dans la boucle de jeu

12

À l'intérieur de la boucle de jeu, le jeu est interrompu en appuyant sur P, ce qui signifie que la boucle de jeu ne s'exécute plus. Le problème est qu'après l'arrêt de cette boucle, P ne peut pas être pressé à nouveau pour reprendre la boucle, car il était à l'intérieur de la boucle elle-même. Comment faire en sorte que lorsque vous appuyez à nouveau sur P, la boucle fonctionne à nouveau?

GSquadron
la source

Réponses:

20

N'arrêtez pas réellement la boucle du jeu lorsque vous interrompez le jeu. Au lieu de cela, vous devez ajouter une variable bool, qui est remplacée par true / false selon que le jeu est en pause. Si le jeu est en pause, vous n'avez qu'à arrêter la mise à jour du jeu, mais vous pouvez toujours rendre le cadre actuel, y compris les mises à jour de l'entrée.

if(gameIsPaused == false)
{
    // run updates
}
checkInput();
render();
Katu
la source
Vous voudrez peut-être avoir une checkInputfonction différente pour le mode suspendu et le mode non suspendu, car il peut y avoir des contrôles qui ne sont disponibles que dans un mode ou dans l'autre. La checkInputfonction pour le mode pause peut ne rien faire de plus que de regarder si elle Pest appuyée puis définie gameIsPaused = false, mais certains jeux placent également des fonctionnalités supplémentaires sur l'écran de pause (dans les années 90, il était populaire d'avoir l'écran de pause comme entrée cachée pour les codes de triche, moderne jeux aiment le combiner avec un écran de menu).
Philipp
1
Bien que je sois généralement d'accord avec votre réponse, je pense qu'il convient de préciser explicitement qu'il est parfois parfaitement valide d'exécuter certaines mises à jour dans l'état suspendu. Par exemple, animer des éléments de menu ou peut-être une gestion audio. La grande idée est que la condition de pause vous permet de vous connecter à un autre ensemble d' appels checkInput/ render/ update.
Nicholas Miller
La seule chose que la pause du jeu devrait changer est que le bit "update world" doit être ignoré. Toutes les autres fonctionnalités devraient probablement rester normales.
Mooing Duck
4
J'ai essayé de garder la réponse aussi simple que possible, car il s'agit de trucs très basiques dans la programmation de jeux et je n'ai pas voulu confondre le questionneur.
Katu
1
@ user3730788: Une branche qui s'exécute une fois par boucle de jeu (c'est-à-dire moins de 100 fois par seconde) n'aura aucun impact perceptible sur les performances, même si elle est mal prédite à chaque fois .
Ilmari Karonen
1

Faites en sorte que le fait d'appuyer sur P bascule vers une autre boucle qui gère l'état de jeu "En pause" et permet de revenir à la boucle de jeu d'origine en appuyant à nouveau sur P.

Vous pouvez réellement mettre tout cela dans la boucle de jeu elle-même et introduire une variable d'état, si vous le souhaitez et au lieu de désactiver la boucle, la variable d'état bascule entre l'exécution du code spécifique à l'état respectif dans la boucle.

Haf
la source