Как правильно подходить к написанию многопутевых "сюжетных" потоков?

Интересно, можешь ли ты мне помочь?

Я пишу игру (2d), которая позволяет игрокам идти по нескольким маршрутам, некоторые из которых ветвятся / объединяются - возможно, даже петля. Каждый раздел игры будет решать, какой раздел будет загружен следующим.

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

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

Я изначально планировал дать каждому StoryElement NextElement() As IStoryElement собственность и Completed() событие. Когда вентиляционное отверстие срабатывает, движок считывает свойство NextElement, чтобы найти следующий StoryElement,

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

Я рассмотрел несколько других решений, но все они чувствуют себя немного неуклюже - например, нужен ли мне дополнительный уровень абстракции? т.е. StoryElementPlayers или аналогичные - каждый из них будет отвечать за объединение нескольких StoryElement возможно, Series и ChoicePlayer, каждый из которых отвечает за построение графика StoryElement - Но это только переместит проблему на уровень выше.

Короче говоря, мне нужен какой-то способ эмуляции простого, но динамического рабочего процесса (но я бы на самом деле не использовал WWF). Есть ли образец для чего-то такого простого? Все, что мне удалось найти, относится к более продвинутому потоку управления (параллельная обработка и т. Д.)

2 ответа

Решение

Это может помочь подумать о StoryElement объекты как узлы в ориентированном графе. Края графика могут быть представлены StoryElementTransition объекты (или похожее имя). StoryElementTransition может содержать ссылки на состояние, из которого вы хотите перейти, состояние, в которое вы хотите перейти, и, возможно, событие, которое инициирует переход.

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

Я знаю, что на этот вопрос есть принятый ответ, и, возможно, вы все равно решили, но я должен сказать, что в последнее время я думал об этом ("как мы должны моделировать сюжетно-ориентированную игру?") И о выводах, к которым я пришел на данный момент:

  • Истории - это данные, их нельзя нигде определять в коде.

(То же самое относится и к элементам игрового процесса, например, вы не должны иметь Goblin Класс, вместо этого вы можете загрузить Enemy.Creep называется "Гоблин" из какой-то базы врагов.)

  • Большинство проектов, которые вы можете придумать, будут ограничены или их сложно будет расширить.

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

  • Большинство профессиональных игр используют скрипты и движок.

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

  • Вы не должны касаться своего двигателя после определенного момента и сосредоточиться на истории.

Это означает, что вы будете редактировать файлы истории (базы данных? Разметки? Скрипты?) И смотреть, как они играют вместе, оставляя свой компилятор в покое.

Другие вопросы по тегам