Я работаю над игрой, в которой некоторые внутриигровые события должны происходить время от времени. Хорошим примером будет учебник. Вы запускаете игру, и в нескольких точках игры происходит событие:
- Вы встречаете своего первого врага, игра останавливается, и вы получаете объяснение, как его убить.
- Вы убили первого врага, вы получаете сообщение «хорошая работа».
- Вы получаете новый предмет, меню с всплывающей статистикой предметов.
- и т. д.
Игра, над которой я работаю, - это игра-головоломка, в которой правила игры почти одинаковы, поэтому неэффективно жестко кодировать все эти события на разных уровнях.
Должен ли я как-то определить эти события во внешнем источнике, таком как XML? Затем напишите интерпретатор, который считывает XML и устанавливает требования к событиям для уровня? Я не уверен, как я мог определить событие, которое должно произойти, когда вы убили двух врагов, например.
Просто чтобы быть ясным, я не ищу лучший язык программирования или язык сценариев для этого, но больше лучший способ справиться с этим.
Благодарность!
Изменить: второй пример, так как мой вопрос было довольно трудно понять:
Проблема, которую я имею, состоит в том, чтобы добавить в игру некоторые дополнительные действия, которые всегда одинаковы. Как и в RPG-битве, у каждого есть свой ход, он выбирает навык и т. Д. - он всегда один и тот же. Но что, если бы был случай, когда я хотел бы показать кат-сцену где-то посередине. Modyfing всю структуру игры, чтобы пройти в измененном боевом классе с включенной заставкой, кажется очень неэффективным. Мне интересно, как это обычно делается.
источник
Ответы:
Это во многом зависит от того, как события фактически передаются между объектами в вашей игре. Например, если вы используете центральную систему обмена сообщениями, то у вас может быть учебный модуль, который прослушивает определенные сообщения и создает всплывающие окна учебника всякий раз, когда он слышит определенные сообщения. Затем вы можете указать, какое сообщение прослушивать, а также какое всплывающее окно показывать, в файле XML или в том, что анализируется учебным модулем. Имея отдельный учебный объект, который отслеживает состояние игры и отображает всплывающие подсказки, когда он замечает какие-либо вещи в игре, вы можете изменить учебный объект по своему усмотрению, не внося никаких изменений в свою игру. (Это шаблон Observer? Я не знаком со всеми шаблонами проектирования.)
В целом, хотя это зависит от сложности вашего урока, стоит ли беспокоиться об этом. Жесткое кодирование событий в вашем коде и / или уровнях не кажется для меня большой проблемой для всего лишь нескольких всплывающих окон. Мне любопытно, что именно вы имеете в виду, что заставляет вас думать, что это будет неэффективно, поскольку все, что вы должны делать при каждом запуске, - это просто отправлять сообщение в учебный модуль, что-то вроде TutorialModule.show ("1st_kill");
источник
Вот ограничения дизайна, как я их понимаю:
Основной код игрового процесса не заботится о требованиях к уровню и не должен быть связан с кодом, который им занимается.
В то же время, это основной код игрового процесса, который знает, когда происходят конкретные события, отвечающие этим требованиям (получение предмета, убийство врага и т. Д.)
Различные уровни имеют разные наборы требований, и их нужно где-то описать.
Учитывая это, я бы, вероятно, сделал что-то вроде этого: во-первых, создайте класс, который представляет игровой уровень. Он будет включать в себя набор конкретных требований, предъявляемых к уровню. У него есть методы, которые можно вызывать, когда происходят игровые события.
Дайте ядру игрового кода ссылку на объект текущего уровня. Когда происходит событие геймплея, он расскажет уровень, вызывая его методу:
enemyKilled
,itemPickedUp
и т.д.Внутренне
Level
нужно несколько вещей:LevelRequirement
объектов, которые описывают определенный набор целей, которые вам нужны для этого уровня.Когда вы входите в уровень, вы создаете
Level
правильныеLevelRequirement
s, настраиваете код игры и задаете ему этот уровень.Каждый раз, когда происходит игровое событие, игровой процесс передает его
Level
. Это, в свою очередь, вычисляет совокупные данные (общее количество убитых врагов, убитых врагов этого типа и т. Д.). Затем он просматривает свои объекты требований, предоставляя каждому агрегированные данные. Требование проверяет, выполнено ли оно, и если да, то порождает любое подходящее поведение в результате (показ учебного текста и т. Д.)LevelRequirement
в основном нужны две вещи:RequirementType
перечисление с такими вещами, как,FIRST_KILL
а затем большой,switch
который знает, как проверить каждый вид.)Остается вопрос, где описаны эти наборы требований? Вы можете сделать что-то вроде XML или другой формат текстового файла. Это полезно, если:
Если ни один из этих случаев не подходит, я бы, вероятно, просто сконструировал их непосредственно в коде. Проще всегда лучше.
источник
Я подумал, что Вам нужно знать, как сделать эти события, а остальная часть поста об этом. Если вы хотите просто сохранить эти события, то используйте некоторую реляционную базу данных или опишите их с помощью текста и используйте язык сценариев (он выполнит анализ и оценку для Вы). :)
Вам нужно распознать произошедшие события (1), а затем выполнить некоторые действия, которые требуются этими событиями (распечатать сообщение, проверить нажатие клавиши ...) (2). Вы также хотите, чтобы эти события происходили только один раз (3).
По сути, вы хотите проверить условия, а затем запланировать некоторые действия.
Как распознать события (1)
Из чего сделаны события
В более общем виде каждое такое событие состоит из:
Как хранить эти события
В некоторой структуре данных:
Вы также можете сохранить его в реляционной базе данных, хотя, похоже, что в этом нет необходимости, если вы хотите сделать эту игру по-крупному, вам может понадобиться ее создать.
Затем вы должны разобрать эти строки / вещи. Или Вы можете использовать некоторый язык сценариев, такой как Python или LUA, или язык, такой как LISP, они все могут проанализировать и выполнить его для Вас. :)
Как использовать эти события в игровом цикле (2)
Вам понадобятся эти две структуры данных:
Алгоритм:
Как сделать эти действия самостоятельно (2)
Вы составляете список объектов, у которых есть функция «обновление». Их иногда называют сущностями (в движке Quake) или актерами (в движке Unreal).
Акция "скажи что-нибудь"
Действие "Требуется ключ"
Какие методы выучить
источник