2010-01-27 3 views
7

В свободное время я программирую игры как хобби, разные вещи и в настоящее время ничего сложного. Вещи любят стрелялки 2d, Игры на основе плитки, Логические игры и т. Д.Методы уменьшения сложности при программировании игр

Однако, поскольку развитие этих игр продолжается, мне становится сложно управлять сложностью различных подсистем в играх, такими как Interface, World View/Model, Обработка событий, состояния (меню, пауза и т. Д.), Специальные эффекты и т. Д.

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

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

Какие методы я могу использовать, чтобы помочь мне манипулировать всеми этими различными подсистемами и справиться со сложностью постоянно растущей системы, которая должна быть достаточно модульной, чтобы облегчить быстрое изменение требований?

Я часто задаю те же вопросы:

  • Как объекты взаимодействуют друг с другом?
  • Где должен работать код, который обрабатывает определенные подсистемы?
  • Какова часть моей базы кода, о которой я должен думать в свое время?
  • Как уменьшить сцепление между игровыми объектами?

ответ

9

Ах, если бы у вас был хороший ответ на ваш вопрос. Тогда развитие игры было бы не таким сложным, рискованным и трудоемким.

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

Они делают, но часто им не нужно разговаривать так же прямо, как люди сначала верят. Например, обычно, когда значения состояния игры вставляются в свой графический интерфейс, когда что-то меняется. Если вместо этого вы можете просто сохранить значения и позволить GUI запросить их (возможно, с помощью шаблона наблюдателя), вы удалили все ссылки GUI из состояния игры. Часто это достаточно просто спросить, может ли подсистема тянуть необходимую информацию из простого интерфейса вместо того, чтобы передать данные в систему.

  • Как объекты взаимодействуют друг с другом?
  • Где должен работать код, который обрабатывает определенные подсистемы?
  • Какова часть моей базы кода, о которой я должен думать в свое время?
  • Как уменьшить сцепление между игровыми объектами?

Все это действительно специфичны для игр, но это проблема, которая возникает часто с играми, потому что есть так много разрозненных подсистем, которые мы еще не разработаны стандартные подходы к. Если вы занимаетесь веб-разработкой, существует действительно небольшое количество установленных парадигм: «один шаблон/код для каждого URI», например, PHP, или, возможно, подход «модель/вид-шаблон/контроллер» RoR, Django, плюс еще пара других. Но для игр все катаются самостоятельно.

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

Игровые подсистемы живут на любом уровне, в котором они нуждаются, и не выше. Обычно у меня есть приложение верхнего уровня, которому принадлежат объекты Graphics, Sound, Input и Game (среди прочих). Объект Game владеет Картой или Миром, Игроками, не-игроками, вещами, которые определяют эти объекты и т. Д.

Четкие состояния игры могут быть немного сложными, но на самом деле они не так важны, как люди предполагают, что они находятся. Пауза может быть закодирована как логическое значение, которое при установке просто отключает обновления AI/Physics. Меню можно кодировать как простые наложения графического интерфейса. Таким образом, ваше «состояние меню» просто становится случаем приостановки игры и отображения меню, а также приостановки игры, когда меню закрыто, - нет явного управления состоянием.

Сокращение сцепления между игровыми объектами довольно легко, опять же, если у вас нет аморфной идеи о том, что представляет собой игровое сущность, что приводит ко всему, что нужно, чтобы потенциально говорить со всем. Игровые персонажи обычно живут в пределах Карты или Мира, которая по существу является пространственной базой данных (между прочим) и может попросить Мир рассказать об окружающих персонажах и объектах, не требуя при этом прямых ссылок на них.

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

+0

Отличный ответ, именно то, что я искал. Кажется, мой нынешний дизайн страдал от попыток сделать идеальный «IObject». Еще раз спасибо. –

+3

+1 для * «Сначала решайте индивидуальные проблемы ... рефакторинг, когда идете». * –

4

Я работаю над книгой именно по этому вопросу: Game Programming Patterns.

+0

Выглядит интересно, мне придется следить за этим. –

Смежные вопросы