Menu
CoddyTech

Введение в паттерны проектирования

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 45 из 65.

Шаблон проектирования — это известный, имеющий название способ организации классов для задачи, которая повторяется от программы к программе. Это не библиотека и не код для копирования: он описывает, какие объекты существуют, за что отвечает каждый из них и как они взаимодействуют. Ты сам пишешь код, адаптируя его под свою игру.

Шаблоны также дают разработчикам общий язык. Фраза «Враги создаются фабрикой» или «Полоса здоровья наблюдает за игроком» объясняет коллеге, как организован код, ещё до того, как он откроет файл.

Вот проблему, которую решает паттерн. Чтобы начать уровень, нужно взаимодействовать с тремя объектами, и каждый скрипт, запускающий уровень, повторяет эти строки:

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)

Паттерн Facade помещает перед этими объектами один класс и предоставляет ему один простой метод:

# 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

Остальная часть программы вызывает start_level(), а когда способ запуска уровня меняется, вы редактируете один файл.

Паттерны сгруппированы по решаемой ими проблеме:

  • Порождающие паттерны определяют, как создаются объекты: Singleton, Factory.
  • Структурные паттерны объединяют объекты в более крупные структуры: Facade, Adapter, Decorator, Composite.
  • Поведенческие паттерны организуют взаимодействие объектов: Observer, Strategy, Command, Template Method, State.

В этой и следующей главе рассматриваются эти шаблоны. Каждый из них построен на том, что вы уже знаете: классы в отдельных файлах, наследование, полиморфизм, композиция и сигналы.

challenge icon

Задание

Легко

Игра запускает и завершает уровни с помощью трёх уже написанных объектов: MusicPlayer (music_player.gd), LevelMap (level_map.gd) и Hud (hud.gd). Напиши фасад GameFacade, который будет управлять ими:

  • Он создаёт по одному объекту MusicPlayer, LevelMap и Hud в своих переменных-членах.
  • start_level(number, hearts) воспроизводит дорожку level_N.ogg (N — номер уровня) или boss.ogg, если номер кратен 5, затем загружает карту этого уровня, а после этого показывает сердца.
  • quit_level() скрывает HUD, а затем останавливает музыку.

Предоставленный код считывает количество следующих команд, а затем по одной команде в каждой строке: start NUMBER HEARTS или quit. Для start 5 2 и quit вывод будет таким:

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

Твой код нужно написать в game_facade.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя изменять.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений
	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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript