Menu
CoddyTech

Introducción a los patrones de diseño

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 45 de 65.

Un patrón de diseño es una forma conocida y con nombre de organizar clases para un problema que se repite en un programa tras otro. No es una biblioteca ni código para copiar: describe qué objetos existen, de qué es responsable cada uno y cómo trabajan juntos. Tú escribes el código, adaptado a tu juego.

Los patrones también proporcionan un vocabulario común a los desarrolladores. «Los enemigos se crean en una fábrica» o «la barra de salud observa al jugador» le indica a un compañero cómo está organizado el código antes de que abra un archivo.

Aquí tienes un problema que resuelve un patrón. Iniciar un nivel implica comunicarse con tres objetos, y cada script que inicia un nivel repite estas líneas:

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)

El patrón Facade coloca una clase delante de esos objetos y le proporciona un método sencillo:

# 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

El resto del programa llama a start_level(), y cuando cambia el nivel que se va a iniciar, editas un archivo.

Los patrones se agrupan según el problema que resuelven:

  • Los patrones creacionales controlan cómo se crean los objetos: Singleton, Factory.
  • Los patrones estructurales combinan objetos en estructuras más grandes: Facade, Adapter, Decorator, Composite.
  • Los patrones de comportamiento organizan cómo colaboran los objetos: Observer, Strategy, Command, Template Method, State.

Este capítulo y el siguiente abarcan estos patrones. Cada uno se construye a partir de lo que ya sabes: clases en sus propios archivos, herencia, polimorfismo, composición y señales.

challenge icon

Desafío

Fácil

Un juego inicia y finaliza niveles mediante tres objetos que ya están escritos: MusicPlayer (music_player.gd), LevelMap (level_map.gd) y Hud (hud.gd). Escribe la fachada GameFacade delante de ellos:

  • Crea un MusicPlayer, un LevelMap y un Hud en sus variables miembro.
  • start_level(number, hearts) reproduce la pista level_N.ogg (N es el número del nivel), o boss.ogg cuando el número es múltiplo de 5, después carga el mapa de ese nivel y, después, muestra los corazones.
  • quit_level() oculta el HUD y, después, detiene la música.

El código proporcionado lee cuántos comandos siguen y, después, un comando por línea: start NUMBER HEARTS o quit. Para start 5 2 y quit, la salida es:

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

Tu código va en game_facade.gd. main.gd contiene el código de entrada y salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: déjalo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online