Up to date

This page is up to date for Godot 4.3. If you still find outdated information, please open an issue.

Heads up display (HUD)

La dernière pièce dont notre jeu a besoin est une Interface Utilisateur (IU), User Interface (UI) en anglais, pour afficher des éléments comme le score, un message "game over" et un bouton de redémarrage.

Créez une nouvelle scène, cliquez sur le bouton "Autre nœud" et ajoutez un nœud CanvasLayer nommé HUD. "HUD"» signifie « Heads-Up Display (affichage tête haute) », un affichage d'informations qui apparaît en superposition au-dessus de la vue du jeu.

Le nœud CanvasLayer nous permet de dessiner nos éléments de l'interface utilisateur sur un calque au-dessus du reste du jeu, de sorte que les informations qu'il affiche ne sont couvertes par aucun élément du jeu comme le joueur ou les monstres.

Le HUD doit afficher les informations suivantes :

  • Le score, modifié par ScoreTimer.

  • Un message, tel que "Game Over" ou "Get Ready"

  • Un bouton "Démarrer" pour commencer le jeu.

Le nœud de base pour les éléments de l'interface utilisateur est Control. Pour créer notre interface utilisateur, nous utiliserons deux types de nœuds Control : Label et Button.

Créez les éléments suivants en tant qu'enfants du nœud HUD :

  • Un Label nommé ScoreLabel.

  • Un Label nommé Message.

  • Un Button nommé StartButton.

  • Un Timer nommé MessageTimer.

Cliquez sur le ScoreLabel et dans l'inspecteur, entrez un nombre dans le champ Text. La police par défaut pour les nœuds Control est petite et ne s'ajuste pas correctement. Il existe un fichier de police inclus dans les ressources du jeu appelé "Xolonium-Regular.ttf". Pour utiliser cette police, procédez comme suit :

Sous "Thèmes de remplacement > Polices", choisissez "Charger" et sélectionnez le fichier "Xolonium-Regular.ttf".

../../_images/custom_font_load_font.webp

La taille de la police est encore trop petite, augmentez-la à 64 sous "Remplacements de thème > Tailles de police". Une fois que vous avez fait cela avec ScoreLabel, répétez les modifications pour les nœuds Message et StartButton.

../../_images/custom_font_size.webp

Note

Ancres : les nœuds Control ont une position et une taille, mais ils ont également des ancres. Les ancres définissent l'origine, c'est-à-dire le point de référence des arêtes du nœud.

Disposez les nœuds comme affiché ci-dessous. Vous pouvez faire glisser les nœuds pour les placer manuellement ou, pour un placement plus précis, utiliser les "préréglages d'ancre".

../../_images/ui_anchor.webp

ScoreLabel

  1. Ajouter le texte 0.

  2. Réglez "Alignement horizontal" et "Alignement vertical" sur "Centre".

  3. Choisissez le « Préréglage d'ancrage » « Centre Haut ».

Message

  1. Ajoutez le texte : Dodge the Creeps !.

  2. Réglez "Alignement horizontal" et "Alignement vertical" sur "Centre".

  3. Réglez le "Autowrap Mode" sur Word, sinon l'étiquette restera sur une seule ligne.

  4. Sous "Contrôle - Disposition/Transformation", définissez "Taille X" sur 480 pour utiliser toute la largeur de l'écran.

  5. Choisir le "préréglage d'ancre" Centre.

StartButton

  1. Ajoutez le texte Start.

  2. Sous "Contrôle - Disposition/Transformation", définissez "Taille X" sur 200 et "Taille Y" sur 100 pour ajouter un peu plus de remplissage entre la bordure et le texte.

  3. Choisissez le « Préréglage d'ancrage » Centre Bas.

  4. Sous "Contrôle - Disposition/Transformation", définissez "Position Y" sur 580.

Sur le MessageTimer, mettez le Wait Time à 2 et mettez la propriété One Shot à "On".

Ajoutez à présent ce script au HUD :

extends CanvasLayer

# Notifies `Main` node that the button has been pressed
signal start_game

Nous pouvant maintenant afficher un message temporaire, comme "Prêt", nous ajoutons donc le code suivant

func show_message(text):
    $Message.text = text
    $Message.show()
    $MessageTimer.start()

Nous devons également traiter ce qui se passe lorsque le joueur perd. Le code ci-dessous affichera "Game Over" pendant 2 secondes, puis reviendra à l'écran titre et, après une brève pause, affichera le bouton "Start".

func show_game_over():
    show_message("Game Over")
    # Wait until the MessageTimer has counted down.
    await $MessageTimer.timeout

    $Message.text = "Dodge the Creeps!"
    $Message.show()
    # Make a one-shot timer and wait for it to finish.
    await get_tree().create_timer(1.0).timeout
    $StartButton.show()

Cette fonction est appelée lorsque le joueur perd. Elle affichera "Game Over" pendant 2 secondes, puis reviendra à l'écran de titre et affichera le bouton "Start".

Note

Quand vous avez besoin d'une courte pause, une alternative à l'utilisation d'un nœud Timer est d'utiliser la fonction create_timer() de l'arborescence de scène. Ceci peut être très utile pour créer un délais, comme dans le code ci-dessus, où nous voulons attendre un peu avant de faire apparaître le bouton "Start".

Ajoutez le code ci-dessous à HUD pour mettre à jour le score

func update_score(score):
    $ScoreLabel.text = str(score)

Connectez le signal pressed() de StartButton et le signal timeout() de MessageTimer au nœud HUD et ajoutez le code suivant aux nouvelles fonctions :

func _on_start_button_pressed():
    $StartButton.hide()
    start_game.emit()

func _on_message_timer_timeout():
    $Message.hide()

Connecter le HUD à Main

Maintenant que nous avons fini de créer la scène du HUD, sauvegardez-la et retournez à Main. Instanciez la scène HUD dans Main comme vous l'avez fait dans la scène Player. L'arbre de scène devrait ressembler à ça, alors assurez-vous de ne rien manquer :

../../_images/completed_main_scene.webp

Nous devons maintenant connecter la fonctionnalité HUD à notre script Main. Cela nécessite quelques ajouts à la scène Main :

Dans l'onglet Nœud, connectez le signal start_game du HUD à la fonction new_game() du nœud principal en cliquant sur le bouton "Choisir" dans la fenêtre "Connecter un signal" et en sélectionnant la méthode new_game() ou saisissez "new_game" sous "Méthode du récepteur" dans la fenêtre. Vérifiez que l'icône de connexion verte apparaît maintenant à côté de func new_game() dans le script.

Dans new_game(), mettez à jour l'affichage des scores et affichez le message "Get Ready" :

$HUD.update_score(score)
$HUD.show_message("Get Ready")

Dans game_over() nous devons appeler la fonction HUD correspondante :

$HUD.show_game_over()

Enfin, ajoutez ceci à on_score_timer_timeout() pour que l'affichage reste synchronisé avec le changement de score :

$HUD.update_score(score)

Avertissement

N'oubliez pas de supprimer l'appel à new_game() dans _ready() si vous ne l'avez pas déjà fait, sinon votre jeu démarrera automatiquement.

Now you're ready to play! Click the "Play the Project" button.

Supprimer les vieux Creeps

Si vous jouez jusqu'au "Game Over" et que vous commencez une nouvelle partie immédiatement, les monstres de la partie précédente sont toujours à l'écran. Il vaudrait mieux qu'ils disparaissent tous au début d'une nouvelle partie. Il nous faut juste un moyen de dire à tous les monstres de se supprimer. Nous pouvons le faire grâce à la fonction "groupe".

In the Mob scene, select the root node and click the "Node" tab next to the Inspector (the same place where you find the node's signals). Next to "Signals", click "Groups" to open the group overview and the "+" button to open the "Create New Group" dialog.

../../_images/group_tab.webp

Name the group mobs and click "ok" to add a new scene group.

../../_images/add_group_dialog.webp

Now all mobs will be in the "mobs" group.

../../_images/scene_group_mobs.webp

We can then add the following line to the new_game() function in Main:

get_tree().call_group("mobs", "queue_free")

La fonction call_group() appelle la fonction nommée sur chaque nœud d'un groupe - dans ce cas nous disons à chaque mob de s'effacer eux-même.

Le jeu est pratiquement terminé à ce stade. Dans la prochaine et dernière partie, nous allons le peaufiner un peu en ajoutant un arrière-plan, une musique qui boucle et quelques raccourcis clavier.