Я только что прочитал несколько связанных вопросов, которые возникли, когда я набрал тему, поэтому я постараюсь не повторять их.
Я недавно начал пересматривать учебный проект, который я начал два или три года назад - порт C ++ движка Mega Man. Да, я использовал разорванные спрайты. Я также использую библиотеку игрового движка для рисования, музыки и ввода.
Мой оригинальный код был зверским. Хотя его можно (но едва ли) назвать ОО, он полностью упустил суть. Я начал добавлять такие вещи, как интерфейсы, и вырезал много повторяющегося кода. В некоторых вещах я не уверен, потому что дизайн игры иногда становится очень сложным.
Объект, который представляет мою игровую библиотеку, в настоящее время является глобальным (я знаю, что глобальные значения обычно плохие), потому что многие объекты могут полагаться на него здесь и там для таких вещей, как загрузка их произведений искусства или музыки. Как лучше всего вывести этот объект из глобальной области, не передавая пятьдесят параметров всему, что в противном случае использовало бы его напрямую?
Следующий вопрос: Как мы все знаем, Mega Man выпускает много маленьких белых снарядов. В настоящее время объект Player отвечает за объекты Projectile, которые он запускает, обновляя их положение и т. Д. (Буквально, вызывая метод Projectile :: Update () один раз для каждого выстрела внутри метода Player :: Update ()). Это неправильный способ сделать это? Моим первым улучшением было то, что все эти объекты реализовали интерфейс DrawnObject, так что моя игра может просто рисовать все. То же самое для обновлений означало бы, что я заберу контроль над снарядами у игрока и передам его какому-то более широкому игровому объекту. Причина, по которой я сомневаюсь в этом, заключается в том, что это похоже на антипаттерн объекта Бога. Или я по недоразумению сказал антипаттерн? По-прежнему возникает дополнительная сложность - снаряды умирают, если они покидают видимый экран, поэтому любой вызов для обновления снаряда требует от вызывающего доступа доступа к экранному объекту.
Пока все, я вернусь с новыми проблемами, когда доберусь до них. Конец первого поста!