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

11

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

Предположим, что интерфейс в стиле Monkey Island или Maniac Mansion, с палитрой глаголов, а также объекты в сцене и в инвентаре. При нажатии на них, вы строите предложение выполнить.

например, вы можете щелкнуть, look atа затем дерево, чтобы «взглянуть на дерево», или щелкнуть яблоко, а затем give, а затем и девушку, получить «дать яблоко девушке».

Есть три возможных формы предложения:

  • verb, Например «сохранить»
  • verb noun, Например, «забрать яблоко», «посмотреть на осьминога»
  • verb noun nounНапример, "дать рассол бешеной собаке", "использовать лом с маринованной банкой"

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

Например, для giveглагола может быть определено действие по умолчанию, которое заставляет персонажа сказать что-то вроде «я бы предпочел держаться за это», или бешеная собака может определить действие, в котором она съедает все, что вы пытаетесь дать ему. ,

Если интерфейс должен работать как Maniac Mansion, то вы строите предложение, а затем приказываете его выполнить (в Maniac Mansion, либо щелкнув предложение, либо снова щелкнув по последнему нажатию).

Если это работает как Остров Обезьян, предложение выполняется, как только оно завершено, что создает проблему для глаголов, например, useкоторые иногда могут принимать одно существительное, а другие - два.

Итак, как бы вы внедрили систему, которая обрабатывает это?

SpoonMeiser
источник
1
Кажется, есть три типа глагола, один тип для нулевых существительных, другой для двух и т. Д. Они не принадлежат к одному и тому же классу объектов. Вы не можете «смотреть на осьминога с маринованной банкой», так lookже как и глагол с одним существительным и т. Д.
tenpn

Ответы:

10

Возможно, вам будет проще пользоваться, если вы измените порядок выбора. Таким образом, пользователь нажимает на существительное, а затем игра отображает набор глаголов, которые можно выполнить с этим существительным. Если для глагола требуется объект (т. Е. «Дать ___»), то игра ждет, пока пользователь не выберет объект, прежде чем выполнять действие.

Что-то типа:

  1. Пользователь нажимает чизбургер.
  2. Игра показывает меню: «Возьми, съешь, посмотри, дай ___».
  3. Пользователь выбирает «дать ___».
  4. Игра говорит "дать кому?" и ждет, когда пользователь щелкнет другое существительное (или кнопку отмены).
  5. Пользователь нажимает на обезьяну.
  6. Игра отдает чизбургер обезьяне.

С точки зрения реализации, каждый объект в игре должен иметь данные для:

  1. Какой набор глаголов вы можете применить к нему.
  2. Для глаголов это позволяет взять объект, набор объектов которого можно применить.
  3. Для каждой пары глагол или объект-глагол, поведение, которое нужно выполнить, когда пользователь делает это.

Поскольку грамматика на самом деле не является гнездом или чем-то еще, вам не нужно что-то более сложное, чем образец интерпретатора.

необычайно щедрый
источник
+1, как на стороне моделирования вещей, так и на стороне интерфейса вещей. Да, в основном, я согласен, потому что я так и делаю, но мне нравится этот ответ.
Drhayes
Если мы согласны с тем, то , очевидно , мы должны быть правы. ;)
крупномасштабное
Итак, вы думаете, что поведение, которое нужно выполнить, всегда должно определяться первым существительным?
SpoonMeiser
1
Да, я думаю , несколько существительных будут делить поведение (так что «подцепить» будет использовать тот же код для получения различных объектов), но это имеет смысл для того , чтобы быть до существительного , чтобы определить набор глаголов , которые могут быть применены к нему. Учитывая, что набор существительных очень большой (каждая вещь в игре) и набор глаголов мал (вероятно, несколько операций), я думаю, что имеет смысл для пользователя сначала выбрать существительное, так как это приводит к падению комбинаций больше быстро. И, прагматично, это позволяет пользователю щелкнуть вещь , чтобы инициировать взаимодействие, а не какое - то слово.
крупномасштабный
Это своего рода полный газ.
Яри Komppa
2

Я представляю упрощенное решение. Он может быть продлен конечно.

Я думаю, что простой список (глагол, object1, object2) решил бы это:

  • если игрок щелкнул объект (глагол) «использовать» и щелкнул объект «воздушный шар» и игрок нажал на объект «насос» и существует триплет («использование», «баллон», «насос»), то вы «использовали баллон с насосом»
  • Иногда object2 будет иметь значение NULL, как в «use helium» (use, helium, NULL)
  • Требовать от игрока сначала щелкнуть глагол объекта
  • если игрок нажимает на то, что не соответствует ничего сказать: «Я не могу это сделать, это нонсенс»
  • Конечно, после каждого клика вы должны проверять правильность последовательности.

Как обращаться со значениями по умолчанию:

  • Если первый щелчок не на глаголе объекта, поиск возможных действий по умолчанию.
  • Один из способов для хранения по умолчанию будет делать квадруплет (глагол, object1, object2, является по умолчанию)
  • Другой способ их хранения - иметь список триплетов по умолчанию.
  • ...

Некоторые примеры:

  • (использовать, баллон, насос)
  • (дай Джон, картошка)
  • (прогулка, пираньи, NULL)
  • (Использование, Баллон-в-инвентаря, насос)
  • (Открытая, от двери до крыши, NULL), по умолчанию .... пример действия по умолчанию

Он может быть продлен:

  • добавьте некоторые события, которые должны быть запущены (дайте игроку что-нибудь, игрок скажет: «Я не могу этого сделать, потому что я могущественный пират», начните кат-сцену, измените что-то в мире ...)
  • добавить некоторые предпосылки. Иногда Баллон может быть в клетке, так что Вы должны были бы выразить «если Баллон не в клетке». Я думаю, что я мог бы подойти к этому с исчислением событий или прологе или сделать это с указателем на функцию ...
  • иногда предложение в командной строке не будет «смотреть в дыру», но будет переписано так, чтобы «смотреть в дыру», для этого потребуется просто переменная :)
user712092
источник
1

Здесь есть две проблемы: интерпретировать входные данные игрока в синтаксическое дерево, а затем выполнить это дерево.

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

После каждого нажатия кнопки, вы можете попросить дерево глагол, если он был в допустимом состоянии продолжить (для входа в островном стиле обезьяны).

После того, как на втором этапе, глагол бетон будет отвечать за разбор его собственное дерево и обновление состояния игры.

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

Проверьте шаблон интерпретатора для получения дополнительной информации на этапе синтаксического анализа.

tenpn
источник
1
Я не думаю, что интерпретация ввода игроков является проблемой. Конечно, нет ничего более сложного, чем анализ ввода текстового приключения, необходимый здесь. Действительно, вопрос сводится к тому, как бы вы спроектировали иерархию объектов и взаимодействия, чтобы обеспечить максимальную гибкость в отношении того, какой объект определяет фактическое действие, которое должно быть выполнено.
SpoonMeiser