Я делаю очень простой визуальный новый тип игры на JavaScript. Я новичок, так что я просто делаю это для удовольствия и обучения, и из-за плохого планирования у меня возникла небольшая проблема, когда вы переходите на ветку в диалоге.
В настоящее время я держу сценарий для игры в строковой переменной и разбиваю каждую сцену с помощью тега, такого как «# ~», на меньшие массивы, чтобы сценарий игры выглядел следующим образом:
var script = "Hello World!#~How are you today?"
var gameText = script.split("#~");
//gameText[0]= Hello World!
Это прекрасно работает для линейных вещей, но как мне обработать ветку в дереве диалога? Этот метод кажется очень сложным, так как я должен был бы точно знать, какова длина каждого пути, а затем, если мне когда-нибудь понадобится что-то изменить, это будет головной болью.
Как я могу сделать это более простым способом? Я пытаюсь придерживаться ванильного JavaScript, поскольку я хотел бы, чтобы игра работала с Web Run Time.
источник
Ответы:
Ответ Филиппа уже показывает правильное направление. Я просто думаю, что структура данных излишне многословна. Более короткие тексты было бы легче писать и читать.
Даже если более короткие тексты сделают алгоритм немного более сложным, это стоит сделать, потому что вы пишете алгоритм только один раз, но большая часть вашего времени будет потрачена на написание и поддержание истории. Поэтому оптимизируйте, чтобы упростить ту часть, на которую вы потратите больше всего времени.
Некоторые объяснения этого дизайна:
Вся история написана в одном массиве. Вам не нужно указывать числа, они предоставляются автоматически с помощью синтаксиса массива: первый элемент имеет индекс 0, следующий - индекс 1 и т. Д.
В большинстве случаев нет необходимости записывать номер следующего шага. Я предполагаю, что большинство строк текста не являются ветвями. Давайте сделаем «следующий шаг - следующий элемент» предположением по умолчанию и будем делать пометки только тогда, когда это не так.
Для прыжков используйте метки , а не цифры. Затем, если вы позже добавите или удалите несколько строк, логика истории будет сохранена, и вам не придется корректировать числа.
Найдите разумный компромисс между ясностью и краткостью. Например, я предлагаю написать «m» вместо «message», потому что это будет самая часто используемая команда из всех, поэтому ее сокращение сделает текст более разборчивым. Но нет необходимости сокращать оставшиеся ключевые слова. (Тем не менее, делайте, как хотите. Важно сделать его максимально разборчивым для вас . В качестве альтернативы вы могли бы поддерживать и «m», и «message» в качестве допустимых ключевых слов.)
Алгоритм игры должен быть примерно таким:
Кстати, эти идеи были вдохновлены Ren'Py , который не совсем то, что вы хотите (не JavaScript, не веб), но в любом случае может дать вам несколько интересных идей.
источник
({ label: "like_yes"; m: "I am happy you like my game!"; next: "like_end" },)
должно быть «,» а не «;». Кроме того, что именно называется в фигурных скобках? Это объект в массиве? если бы я хотел больше информации о том, как использовать это, что бы я искал?{...}
это объект. В JavaScript объект - это ассоциативный массив ключ-значение (с некоторыми дополнительными функциями, не используемыми в этом примере), подобный массиву в PHP или Map в Java. Для получения дополнительной информации см. Статьи Википедии о JavaScript и ECMAScript, а также документацию, связанную с ними, особенно официальную документацию ECMAScript.Я бы порекомендовал вам создать массив событий диалога. Каждое событие - это объект, содержащий текст, который говорит NPC, и массив возможных ответов игрока, которые, в свою очередь, являются объектами с текстом ответа и индексом события, которое следует за этим ответом.
источник
Вы должны использовать другой подход. JavaScript поддерживает массивы и объекты, так почему бы не использовать по одному для каждой записи, сэкономив все разделение, а также упростив редактирование / чтение реального текста?
Если хотите, можете взглянуть на прототип, который я сделал за несколько часов для игры №1 . Исходный код можно бесплатно использовать под GPLv3 (я прекрасно подхожу, если вы не придерживаетесь GPL, если вы просто используете его для вдохновения. Но дайте мне знать, как только ваша игра будет закончена.). Только не ожидайте, что вы будете писать что-нибудь классное ;)
Чтобы дать краткое объяснение того, как работает код, игнорируя CSS-анимацию и тому подобное:
var data
по сути, содержит всю историю со всеми возможными вариантами и т. д.start
, второйcwait
и т. Д.[target location:display text]
.navigate()
: эта функция делает ссылки на разметку кликабельными. Это немного дольше, потому что я также обрабатываю некоторый статический текст для мертвых концов там. Важной частью являются первые два звонкаreplace()
.Вместо определения этих цветов вы также можете добавить ссылки, указывающие на другие местоположения (обратите внимание, что это не обрабатывается моим кодом; это просто идея продемонстрировать это):
'start': ['Waking up', 'You wake...', 'cwait:yell for help', 'cwait: wait a bit', 'clook: look around']
источник