Menu
CoddyTech

Introdução aos Padrões de Projeto

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 45 de 65.

Um padrão de projeto é uma forma conhecida e nomeada de organizar classes para um problema que se repete em programa após programa. Não é uma biblioteca nem código para copiar: ele descreve quais objetos existem, pelo que cada um é responsável e como trabalham juntos. Você escreve o código por conta própria, adaptado ao seu jogo.

Os padrões também dão aos desenvolvedores um vocabulário compartilhado. “Os inimigos vêm de uma fábrica” ou “a barra de vida observa o jogador” explica a um colega de equipe como o código está organizado antes mesmo de abrir um arquivo.

Aqui está um problema que um padrão resolve. Iniciar um nível significa interagir com três objetos, e todo script que inicia um nível repete estas linhas:

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)

O padrão Facade coloca uma classe na frente desses objetos e dá a ela um método simples:

# 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

O restante do programa chama start_level(), e, quando a forma de iniciar um nível muda, você edita um arquivo.

Os padrões são agrupados pelo problema que resolvem:

  • Padrões criacionais controlam como os objetos são criados: Singleton, Factory.
  • Padrões estruturais combinam objetos em estruturas maiores: Facade, Adapter, Decorator, Composite.
  • Padrões comportamentais organizam como os objetos trabalham juntos: Observer, Strategy, Command, Template Method, State.

Este capítulo e o próximo abordam esses padrões. Cada um é construído com base no que você já sabe: classes em seus próprios arquivos, herança, polimorfismo, composição e sinais.

challenge icon

Desafio

Fácil

Um jogo inicia e encerra níveis por meio de três objetos que já estão escritos: MusicPlayer (music_player.gd), LevelMap (level_map.gd) e Hud (hud.gd). Escreva a fachada GameFacade para interagir com eles:

  • Ela cria um MusicPlayer, um LevelMap e um Hud em suas variáveis de membro.
  • start_level(number, hearts) reproduz a faixa level_N.ogg (N é o número do nível) ou boss.ogg quando o número é múltiplo de 5, depois carrega o mapa desse nível e, em seguida, mostra os corações.
  • quit_level() oculta o HUD e, em seguida, para a música.

O código fornecido lê quantos comandos vêm a seguir e, depois, um comando por linha: start NUMBER HEARTS ou quit. Para start 5 2 e quit, a saída é:

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

Seu código deve ficar em game_facade.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online