Разрабатывая игру, где основной способ взаимодействия с игровым миром — щёлканье по ссылкам в описании, столкнулся со следующей интерфейсной проблемой. Обычный порядок ввода/вывода следующий:
1. Выводится описание ситуации.
2. Принимается команда игрока.
3. Выводится описание действия по команде игрока.
4. Выводится реакция игры на команду.
5. ???
Вот тут и кроется нюанс — выводимое в пункте 1 описание к пункту 5 может устареть — некоторые ссылки в нём будут уже не актуальны. Поэтому по-хорошему, нужно либо обновить описание, либо заблокировать ссылки (это из первого, что приходит на ум).
Навскидку варианта два:
А) В пункте 5 блокируем все ссылки в описании (чтобы ничего не нажималось), даём игроку ознакомиться с описанием результата своих действий, после чего очищаем экран и переходим к пункту 1. Отмеченный многими (по демке) минус — лишнее действие игрока после каждой обработки его поступков (нажатие ссылки "продолжить" или клавиши "пробел"). Плюсы — естественная последовательность информации: сначала исходные данные, затем действие, а под конец — результат.
Вы стоите посреди арены перед грозным и голодным великаном!
Вы напали на великана.
Великан откусил вам голову.
[продолжить]
Б) Переставляем порядок ввода/вывода:
1. Выводим описание действия по последней команде игрока.
2. Выводим реакцию игры на последнюю команду игрока.
3. Выводим описание ситуации.
4. Принимаем команду игрока.
5. Переходим к пункту 1.
Вы напали на великана.
Великан откусил вам голову.
Вы стоите посреди арены с откушенной головой. Но есть ещё силы на последний рывок!
Минус — разве что нарушение последовательности подачи информации. Плюс — исключение лишнего действия и незначительное снижение риска туннельного синдрома запястья.
Кто-нибудь сталкивался (реализовывал) с ещё какими-нибудь вариантами? Вариант с непрерывном выводом информации с надеждой на скроллинг, наверное, предлагать не стоит.
Неактивен
А что если так:
1. Выводим описание ситуации.
2. Выводим описание действия по последней команде игрока.
3. Выводим реакцию игры на последнюю команду игрока.
4. Принимаем команду игрока.
5. Переходим к пункту 1.
Неактивен
HzD_Byte написал:
А что если так:
1. Выводим описание ситуации.
2. Выводим описание действия по последней команде игрока.
3. Выводим реакцию игры на последнюю команду игрока.
4. Принимаем команду игрока.
5. Переходим к пункту 1.
Может случиться так, что описание уже не будет соответствовать описываемой команде. В этом случае всё вообще запутается:
Вы стоите посреди арены с откушенной головой. Но есть ещё силы на последний рывок!
Вы напали на великана.
Великан откусил вам голову.
Неактивен
В самое первое сообщение добавил тексты примеров для наглядности.
Неактивен
Если сделать как в игре "13й уровень", то проблемы устаревшего описания не будет - при нажатии ссылки нам выводится описание, соответствующее выбранному предмету, и при каждом произведенном действии, мы получим всегда актуальное описание, содержащее не описание локации, на которой находится игрок, а описание контекста текущих действий. Никакой заморочки.
Если делать как в твоей демке - на экране всегда описание всей комнаты, то действительно, возникает проблема.
Неактивен
Nex написал:
Если сделать как в игре "13й уровень", то проблемы устаревшего описания не будет - при нажатии ссылки нам выводится описание, соответствующее выбранному предмету, и при каждом произведенном действии, мы получим всегда актуальное описание, содержащее не описание локации, на которой находится игрок, а описание контекста текущих действий. Никакой заморочки.
Если делать как в твоей демке - на экране всегда описание всей комнаты, то действительно, возникает проблема.
Ну разумеется, если разбить выводимую информацию на блоки и выводить их по отдельности, то проблем с тем, что в одном может оказаться устаревшая информация, не будет. Но и связи восприятия нарушаются. Когда я читаю текст, то иногда возвращаюсь назад, чтобы перечитать участок текста вместе с новыми строчками (например, когда идёт яркая последовательность действий) — это помогает лучше представить себе ситуацию. Порционная подача текста подобному восприятию мешает.
Поэтому я и пытаюсь нащупать какой-то компромисс, быть может в какой-то мере подкрутив техническое обеспечение вывода.
Так, например, в выложенной демке при осмотре открытого сундука выводится информация о мегачелюсти, но только в виде текста. Это потому, что движок погасил все ссылки после вывода последнего предложения. Сейчас я переделал его так, что гасится лишь описание локации, а содержимое сундука ссылки содержит. Т.е. можно сразу щёлкать на челюсти и что-то с ней делать.
На мой взляд это уже шаг вперёд по части интерфейса. Но нужно подумать, что можно ещё сделать. Например, можно даже организовать сравнение уже выведенного описания локации с текущим, ну и всё такое.
Неактивен
В демке я немного переделал порядок блокировки ссылок и добавил автоматический вывод содержимого при открытии сундука. Вроде как процесс стал живее.
Неактивен
Хм, что-то не заметил разницы с предыдущим примером. Может, не тот файл?
UPD: Разницу понял. Ссылки последнего выведенного блока текста не блокируются.
Отредактировано HzD_Byte (20.09.2010 12:14)
Неактивен
HzD_Byte написал:
Хм, что-то не заметил разницы с предыдущим примером. Может, не тот файл?
При выводе реакции игрового мира на действия игрока ссылки в выводимых текстах не блокируются. Например, когда выламываешь косточку у скелета — можно сразу что-то сделать с косточкой. Кроме того, при открытии сундука автоматически выводится описание его содержимого, в котором также активна ссылка на мегачелюсти.
Неактивен
А между тем, вопрос актуален как никогда.
Неактивен
А если вариант Б, но описание ситуации выводится обновленное, с учетом последнего действия:
Вы напали на великана.
Великан откусил вам голову.
Вы мертвы.
Неактивен
HzD_Byte написал:
А если вариант Б, но описание ситуации выводится обновленное, с учетом последнего действия:
Вы напали на великана.
Великан откусил вам голову.
Вы мертвы.
Вариант Б именно это и подразумевает.
Неактивен
Ну что же — вариант Б вроде более-менее работоспособен. Обкатываю на демке.
Неактивен
Чем-то вариант Б мне не нравится:
Olegus t.Gl. написал:
1. Выводим описание действия по последней команде игрока.
2. Выводим реакцию игры на последнюю команду игрока.
3. Выводим описание ситуации.
4. Принимаем команду игрока.
5. Переходим к пункту 1.> Напасть на великана.
Великан откусил вам голову.
Вы стоите посреди арены с откушенной головой. Но есть ещё силы на последний рывок!
Кстати, а нужен ли заголовок локации? И где и как его лучше выводить?
Так:
Арена
> Напасть на великана.
Великан откусил вам голову.
Вы стоите посреди арены с откушенной головой. Но есть ещё силы на последний рывок!
или так:
> Напасть на великана.
Великан откусил вам голову.
Арена
Вы стоите посреди арены с откушенной головой. Но есть ещё силы на последний рывок!
Неактивен
Второй вариант выглядит разумнее
Неактивен
И всё же, тестовые запуски игры показали слабую жизнеспособность варианта Б — слишком уж мешает восприятию болтающееся внизу описание локации. Ситуация становится похожа на проблему с подписями пользователей на некоторых форумах, которые, часто, куда больше по объёму и по смыслу, чем содержательная часть сообщения. Только здесь в роли текста выступает описание действия игрока и реакции на него, а в роли подписи — описание локации/ситуации, поэтому визуально здесь ничего скрывать нельзя.
Поэтому надо бы поработать над вариантом с последовательным выводом с "гашением" ссылок в предыдущих блоках текста, т.е. вариант А.
По идее при таком подходе сохраняется последовательность работы игрока с поступающей информацией: щёлкая на ссылки в очередном блоке информации и выбирая то или иное действие, игрок получает дополнительную информацию, с которой он вроде как заинтересован работать дальше (не просто так же он на ссылку жал), и так — пока выбранная ветка исследования/использования объектов не будет признана ошибочной (т.е. игрок добровольно отказывается продолжать), либо уткнётся в тупик (т.е. в очередном описании ни одной ссылки не будет). После этого ему остаётся только нажать ссылку "осмотреться", чтобы начать начать с описания локации заново.
Явная засада — если посреди этой цепочки появляется объект, с которым можно/нужно сделать несколько действий. Например, игрок стоит перед стеной в пещере, по которой периодически пробегают жуки разных цветов. Игрок знает, что ему нужен синий жук, а красный — ядовит, и трогать его нельзя. Информацию о том, что по стене бежит жук, игрок получает при осмотре стены (допустим, что по ряду причин автор не стал включать упоминание о цвете жука в описании стены). Игрок, щёлкая на ссылку "жук" в описании стены, получает меню с пунктами "Осмотреть жука" и "Поймать жука". Но, если он выберет "Осмотреть жука", то вариант А погасит ссылку на жука в описании стены, так что игрок не сможет воспользоваться ею для поимки жука. Хотя, разумеется, можно в описании жука вывести ссылку на него же, нажав на которую игрок получит всё то же меню: "Осмотреть"+"Поймать".
Надо бы поработать над этим вариантом.
Неактивен
А между тем, пообщавшись некоторое время назад с Байтом на тему гашения ссылок, "сплавил" итоги дискуссии в любопытную идею. Алгоритм в некотором роде базируется на том, что ссылки на объекты игрового мира в тексте я указываю как ((текст|IDОбъекта)), поэтому содержимое конечного тега полностью под контролем. Стало быть при формировании тега <a> добавляем к нему атрибут "gobj", в который заносим "IDОбъекта". Т.е. ссылка будет иметь вид: <a gobj="IDОбъекта" class="plain" href="exec: GS 'ОбработатьНажатиеНаСсылку',IDОбъекта">текст</a>. Я пока не буду затрагивать возможность добавления цвета текста у ссылки — этот вопрос решаем и на суть алгоритма не влияет.
Теперь сам алгоритм работы с текстом и ссылками в нём:
Неактивен
Разумеется, при этом придётся тщательнее контролировать состав меню объекта. Теперь нельзя надеяться на то, что меню не всплывёт, потому что объект, например, перемещён в другую локацию, и игрок в следующий раз увидит ссылку на него, только войдя в эту локацию.
Т.е. нужно указывать не просто, что данное действие появляется в меню только, если объект находится в локации Б, но и то, что игрок тоже находится в локации Б.
Неактивен
Практические эксперименты (практика — критерий истины) выявили ряд проблем.
Рассмотрим несколько ситуаций:
При этом на экране выведен текст, в котором фигурирует объект "Яблоко".
По идее, ссылка должна "проявиться" только в ситуациях 1, 2 и 4. В ситуации 3 ссылка на яблоко должна активизироваться только после того, как игрок осмотрит коробку.
Прописывать у каждого предмета по каждому пункту меню подобные условия муторно. Лучше уж подумать над понятием доступности/видимости/знания о предмете.
Тут нужно сделать небольшое пояснение насчёт контейнеров, чтобы понимать, как с ними можно работать. У меня любой объект может иметь один или несколько контейнеров (у игрока могут быть контейнеры "инвентарь", "одежда", "желудок", у сундука — "содержимое" и "тайное отделение"). Если объект с контейнером поместить в другой объект с контейнером, то получатся вложенные контейнеры.
Например, при переходе игрока в локацию формируется перечень контейнеров, находящиеся в которых предметы автоматически становятся доступны игроку: инвентарь игрока (+ всё его содержимое), содержимое текущей локации (+ всё её содержимое). При этом у контейнеров объектов неплохо было бы завести признак "осмотрен", который будет влиять на доступность предметов. И всё это обрабатывается функцией "Доступность", которая проверяет, находится ли предмет в каком-нибудь из "доступных" контейнеров.
При таком подходе получается (по номерам ситуаций):
Есть над чем подумать, да…
Неактивен
Для облегчения задачи можно сделать следующее допущение: сведения обо всех "доступных" контейнерах не хранятся постоянно, а сбрасываются в момент захода персонажа в локацию и накапливаются по мере осмотра объектов, то есть:
1. При заходе в локацию перечень доступных персонажу контейнеров сбрасывается.
2. По умолчанию, игроку доступен собственный инвентарь и содержимое локации. Таким образом обеспечивается актуальность ссылок в инвентаре и в описании локации.
3. По мере осмотра содержимого объектов в локации в перечень доступных контейнеров добавляются осмотренные объекты. Таким образом обеспечивается актуальность ссылок в текстах, начиная с захода в локацию (и, соответственно, блокировка тех объектов, которые описывались прежде).
Неактивен
Хм… Вот я пробую всякое… Есть предмет, например, яблоко. Оно фигурирует в описании:
Развалившись на лужайке, вы задумчиво пожёвываете травинку.
На траве перед вами лежитяблоко
.
Игрок берёт яблоко — и этот объект, само собой, перемещается в инвентарь, т.е. в "доступное" для игрока место. Однако подсвечивать ссылку на яблоко в описании лужайки (и выводить меню при нажатии на яблоко) уже как-то некрасиво — например в меню будет пункт "положить яблоко на траву"…
В принципе, ссылки на объекты в инвентаре доступны либо через меню "Инвентарь", либо через перечисление объектов в какой-либо области экрана (это уже как в шаблоне темы игры прописано), т.е. в основном описании их можно "гасить", если не одно "но":
Если в инвентаре у игрока не просто объект, а объект-контейнер, и игрок осматривает его, то описание контейнера со всеми ссылками на хранящиеся в нём объекты выводится в основное окно текста. Допустим, у игрока есть помимо основного инвентаря отдельный контейнер "карман".
Развалившись на лужайке, вы задумчиво пожёвываете травинку.
На траве перед вами лежитяблоко
.
> Взять яблоко
Вы взяли яблоко и сунули его в карман.
> Осмотреть карман
Карман кажется бездонным — столько всего иной раз вы туда напихиваете.
Сейчас там естьяблоко
.
Вот, по-хорошему, первую ссылку неплохо было бы прибить, а вторую оставить:
Развалившись на лужайке, вы задумчиво пожёвываете травинку.
На траве перед вами лежит яблоко.
> Взять яблоко
Вы взяли яблоко и сунули его в карман.
> Осмотреть карман
Карман кажется бездонным — столько всего иной раз вы туда напихиваете.
Сейчас там естьяблоко
.
Однако, если выложить яблоко обратно на траву, то ситуация со ссылками должна быть, наверное, такой:
Развалившись на лужайке, вы задумчиво пожёвываете травинку.
На траве перед вами лежитяблоко
.
> Взять яблоко
Вы взяли яблоко и сунули его в карман.
> Осмотреть карман
Карман кажется бездонным — столько всего иной раз вы туда напихиваете.
Сейчас там есть яблоко.
> Выложить яблоко
Вытащивяблоко
из кармана, вы с сожалением бросили его обратно на траву.
Может, в ссылку помимо ID объекта запихивать ещё и ID контейнера, в котором находился объект в момент вывода ссылки? Тогда при обновлении экрана можно проверять, что если текущее местоположение объекта соответствует сохранённому в ссылке, то ссылку активизировать…
Неактивен
Olegus t.Gl. написал:
Может, в ссылку помимо ID объекта запихивать ещё и ID контейнера, в котором находился объект в момент вывода ссылки? Тогда при обновлении экрана можно проверять, что если текущее местоположение объекта соответствует сохранённому в ссылке, то ссылку активизировать…
Попробовал. Получилось. Вышло обалденно.
Неактивен
Да вроде игрок не полный даун, чтобы не понять, что по ссылке с названием "взобраться" ему предстоит именно взобраться. ) Ты, я думаю, привел слишком упрощенный и гипотетический пример. Если можно, сделай живой пример - не сложный, но правдоподобный.
С уважением.
из обсуждения: https://forum.ifiction.ru/viewtopic.php … 534#p24534
Я жду.
Неактивен
Zeantar написал:
Я жду.
Чего ждёшь? Примера, зачем по ссылке, содержащей лишь одно действие, открывать меню с одним лишь пунктом? Зачем? Моя позиция в этом вопросе вполне объяснима на словах:
Впрочем, чтобы избежать соблазнов, можно просто привязывать ссылки к существительным.
Неактивен
Ну, я тоже думал, нужны ли дополнительные действия простым объектам.
Пока мой вывод таков - нет, не нужны. У сложных - меню, у простых - прямое действие.
Как-то так.
Неактивен