Menu
CoddyTech

Introduction aux patrons de conception

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 45 sur 65.

Un patron de conception est une manière connue et nommée d’organiser des classes pour résoudre un problème qui se répète d’un programme à l’autre. Ce n’est ni une bibliothèque ni du code à copier : il décrit quels objets existent, de quoi chacun est responsable et comment ils fonctionnent ensemble. Tu écris le code toi-même, en l’adaptant à ton jeu.

Les modèles fournissent aussi aux développeurs un vocabulaire commun. « Les ennemis proviennent d’une fabrique » ou « la barre de santé observe le joueur » indique à un coéquipier comment le code est organisé avant même qu’il ouvre un fichier.

Voici un problème qu’un motif permet de résoudre. Démarrer un niveau signifie communiquer avec trois objets, et chaque script qui démarre un niveau répète ces lignes :

var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
music.play("forest.ogg")
level_map.load_map(1)
hud.show_hearts(3)

Le modèle Facade place une classe devant ces objets et lui fournit une méthode simple :

# game_facade.gd
class_name GameFacade
extends RefCounted

var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()

func start_level(number: int) -> void:
	music.play("forest.ogg")
	level_map.load_map(number)
	hud.show_hearts(3)
# main.gd
var game := GameFacade.new()
game.start_level(1)
Music: playing forest.ogg
Map: level 1 loaded
HUD: hearts 3

Le reste du programme appelle start_level(), et lorsque le démarrage d’un niveau change, tu modifies un seul fichier.

Les patrons sont regroupés selon le problème qu’ils résolvent :

  • Les patrons de création contrôlent la manière dont les objets sont créés : Singleton, Factory.
  • Les patrons structurels combinent des objets en structures plus grandes : Facade, Adapter, Decorator, Composite.
  • Les patrons comportementaux organisent la manière dont les objets collaborent : Observer, Strategy, Command, Template Method, State.

Ce chapitre et le suivant abordent ces modèles. Chacun d’eux s’appuie sur ce que tu connais déjà : les classes dans leurs propres fichiers, l’héritage, le polymorphisme, la composition et les signaux.

challenge icon

Défi

Facile

Un jeu démarre et quitte des niveaux à l’aide de trois objets déjà écrits : MusicPlayer (music_player.gd), LevelMap (level_map.gd) et Hud (hud.gd). Écris la façade GameFacade devant eux :

  • Elle crée une instance de MusicPlayer, une de LevelMap et une de Hud dans ses variables membres.
  • start_level(number, hearts) joue la piste level_N.ogg (N est le numéro du niveau), ou boss.ogg lorsque le numéro est un multiple de 5, puis charge la carte de ce niveau, puis affiche les cœurs.
  • quit_level() masque le HUD, puis arrête la musique.

Le code fourni lit le nombre de commandes qui suivent, puis une commande par ligne : start NUMBER HEARTS ou quit. Pour start 5 2 et quit, la sortie est :

Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stopped

Ton code va dans game_facade.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d'entrée/sortie fourni : conservez-le tel quel
	var game := GameFacade.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "start":
			game.start_level(int(parts[1]), int(parts[2]))
		elif parts[0] == "quit":
			game.quit_level()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne