Наткнулся на несколько головоломных моментов:
1. Ссылки на некоторые объекты хотелось бы иметь активными всегда, а не только когда объект находится в известных игроку "контейнерах". Известные контейнеры — это содержимое текущей локации и осмотренные игроком объекты в ней. Так, например, упоминание в описании каких-нибудь объектов или персонажей, которых рядом с игроком как бы и нет. В этом случае можно для объекта указать спец. режим обработки ссылок — т.е. ссылка активна всегда, когда объект в доступных контейнерах или когда при нажатии на него формируется меню.
Кстати, совсем забыл про полезную функцию — формирование меню в режиме проверки, т.е. сформированное меню в итоге не вызывается, а возвращается лишь количество пунктов в нём. Это можно использовать.
2. Что делать с ссылками на локации. Сейчас они у меня активны всегда, однако во время игры сразу же наткнулся на проблему "локация в нескольких переходах".
Вариант — активна всегда локация, в которой находится игрок, плюс автору добавляется возможность указывать перечень локаций, откуда будет доступна та или иная локация. А можно и не заморачиваться, а пойти по пункту 1 и локациям добавить автоматическое присвоение признака "ссылки активны всегда" — а уж за наличие пунктов в меню пусть отвечает автор.
P.S. Чтобы никто заново не возбуждался — под автором я всё ещё подразумеваю себя, хоть и говорю отвлечённо.
Неактивен
Да, и поскольку всякие действия, описания, упоминания и т.п. содержат модуль условия их использования, и этот модуль зачастую состоит из одной строчки типа:
{°Результат=IIF(©Параметр='Встать',Использовать,Пропускать)}
то добавил возможность использования сокращённой формы:
{if:©Параметр='Встать'}
Так и короче пишется, и не нужно помнить, какая константа ("Использовать", "Пропускать" и т.п.) для данной конструкции означает использование, а какая — пропуск.
Неактивен
Nex написал:
Фигасе, значки градуса и копирайта?! Как их набирать?
Клавиатурная раскладка Ильи Бирмана: http://ilyabirman.ru/projects/typography-layout/
Nex написал:
2. Что делать с ссылками на локации.
См. классику INSTEAD.
Как насчёт развернуть свою мысль, чтобы было ясно, что же ты имеешь в виду?
Так, у меня на экране может одновременно находится описание нескольких локаций (textflow), а также описания предметов и действий с упоминаниями тех или иных объектов, ссылки на которые автоматически гасятся, если объекты недоступны. Я не припомню, чтобы кто-нибудь говорил про такое в контексте INSTEAD.
Неактивен
Вопрос.
Что делать с ссылками на локации.
Ответ.
См. классику INSTEAD.
В классических играх INSTEAD уже давно решили эту проблему. Можно взять того же "Квантового Кота", посмотреть, как это реализовано, и сделать так же.
Неактивен
Olegus t.Gl. написал:
Так, у меня на экране может одновременно находится описание нескольких локаций (textflow), а также описания предметов и действий с упоминаниями тех или иных объектов, ссылки на которые автоматически гасятся, если объекты недоступны. Я не припомню, чтобы кто-нибудь говорил про такое в контексте INSTEAD.
Nex написал:
В классических играх INSTEAD уже давно решили эту проблему. Можно взять того же "Квантового Кота", посмотреть, как это реализовано, и сделать так же.
В "Квантовом коте" на экране присутствует только результат последнего действия (после нажатия на ссылку) и текущее описание локации (подобный вариант я разбирал тут). Поэтому говорить, что там "давно решили эту проблему", неправильно — там этой проблемы просто не существует. А предложение "можно взять и сделать так же" — это типа как советовать желающему научиться кататься на лыжах сесть на санки. А что? ведь там "уже давно решили проблему" устойчивости…
Неактивен
При чем тут то, что находится на экране? Постановка вопроса такая:
Что делать с ссылками на локации. Сейчас они у меня активны всегда, однако во время игры сразу же наткнулся на проблему "локация в нескольких переходах".
Вариант — активна всегда локация, в которой находится игрок, плюс автору добавляется возможность указывать перечень локаций, откуда будет доступна та или иная локация. А можно и не заморачиваться, а пойти по пункту 1 и локациям добавить автоматическое присвоение признака "ссылки активны всегда" — а уж за наличие пунктов в меню пусть отвечает автор.
Вот на это я и дал ответ. То, что ты там подразумевал не то, о чем в итоге написал - твои проблемы.
Неактивен
Nex написал:
При чем тут то, что находится на экране? Постановка вопроса такая:
Что делать с ссылками на локации. Сейчас они у меня активны всегда, однако во время игры сразу же наткнулся на проблему "локация в нескольких переходах".
Вариант — активна всегда локация, в которой находится игрок, плюс автору добавляется возможность указывать перечень локаций, откуда будет доступна та или иная локация. А можно и не заморачиваться, а пойти по пункту 1 и локациям добавить автоматическое присвоение признака "ссылки активны всегда" — а уж за наличие пунктов в меню пусть отвечает автор.Вот на это я и дал ответ. То, что ты там подразумевал не то, о чем в итоге написал - твои проблемы.
Даже если отбросить тот факт, что ты участвовал в обсуждении разрабатываемого мной интерфейса (с теми же мыслями впрочем), вместе с просьбой развернуть мысль я напомнил о его (интерфейса) особенностях, хотя эту часть ты, судя по ответу, проигнорировал. Тебе интересно раз от раза давать однотипные советы, даже если тебе говорят, что они не подходят? Не очень полезное времяпрепровождение, право…
Неактивен
Nex написал:
Это был не совет, а ответ на вопрос. То, что мой ответ показался тебе неприемлемым, не моя забота.
Вот только от вопроса ты отсёк всё, что не подходило к ответу. В том числе и накопленный контекст. Смотри аналогию с лыжами и санками.
Неактивен
Посмотрел код "Адского движка" на выходе (т.е. включаемый в "состав" игры). Понял, как важно не потерять исходники исходников…
Пример кода (редактор EmEditor), с которым я и работаю:
Получаемый в результате код (редактор QGen):
Неактивен
Zeantar написал:
Обычная конструкция. Что ты хотел сказать этим?
Ровно то, что написал в первой же строчке: "Понял, как важно не потерять исходники исходников…" Восстанавливать верхний кусок кода из нижнего в случае утраты исходников исходников будет непросто. Равно как и пытаться понять реализованные алгоритмы по нижнему варианту кода.
P.S. Вообще-то тут не приветствуется стиль общения а-ля чат. И важно не только смотреть на картинки, но и читать, что пишут другие.
Неактивен
Zeantar написал:
Приветствуется твой монолог, хочешь сказать?
В этой теме? Вполне возможно что и так, поскольку цель этой темы — ознакомить, а не разъяснить.
Однако, в любом случае приветствуется обсуждение, интересное обеим сторонам, что подразумевает внимательное чтение реплик друг друга. Если ты не понял что-то в этой довольно специфической теме форума — лучше перечитай (можно несколько раз) прежде чем задавать вопросы, ведь на них должно быть интересно отвечать.
Для обсуждения друг друга лучше всего подходит раздел "Изба". Здесь продолжать подобный оффтоп не нужно.
Неактивен
А между тем на Asus EeePC 901 первоапрельский трейлер заметно притормаживает. Замеры времени выполнения некоторых участков кода (через MSECSCOUNT) выявили кое-какие любопытные участки с серьёзным ухудшением времени обработки. Есть над чем подумать.
Неактивен
Olegus t.Gl. написал:
Да, и пришлось обломаться с порционным выводом текста.
Код:
…ТекстНаЭкран, 'Привет мир!<-далее->Я всех ненавижу!'P.S. Почему не получилось? Потому что в QSP-Classic невозможно остановить выполнение кода в отдельной точке (если это не input или msg, конечно же), подождать действия игрока, а потом продолжить далее.
Теперь получилось. Задействовал тот же подход, что и в диалогах (можно увидеть в трейлере): при выводе порций текста, все ссылки на экране гасятся, пока текст не будет выведен до конца.
Неактивен
Хм… Наткнулся на некоторую проблему (не знаю пока, насколько серьёзную) с реализацией чекпоинтов. А именно — момент сохранения чекпоинта.
Как в своё время отмечал Байт, нужно помнить, что при сохранении состояния игры командой SAVEGAME сохраняется не точка кода, а лишь, грубо говоря, состояние переменных и содержимое экрана. То есть нельзя рассчитывать на то, что при восстановлении код продолжит выполнятся с того места, где вы вызвали SAVEGAME — у вас просто нарисуется экран и восстановятся переменные.
Таким образом вызывать SAVEGAME нужно в том месте кода, после которого гарантировано ничего выполняться уже не будет. А у меня с этим очень непросто, потому как игровой код (откуда и вызывается команда создания точки сохранения) обрамлён служебным кодом фреймворка.
1. Начало служебной функции 2. Заполнение вспомогательной информации 3. Запуск игрового кода 4. Вызов SAVEGAME 5. Окончание игрового кода 6. Чистка вспомогательной информации 7. Завершение служебной функции
И если потом загрузить такой чекпоинт (командой OPENGAME), то в нём будет присутствовать всякий мусор, поскольку чистки вспомогательной информации (п.6) и корректного завершения служебной функции (п.7) произведено не было и не будет, потому как у нас восстановится состояние игры в пункте 4 и никаких дополнительных действий произведено не будет.
Предусмотреть состав вспомогательной информации, чтобы как-то почистить её в локации-обработчике загрузки состояния игры ($ONGLOAD), невозможно. Так что есть над чем подумать.
Неактивен
Olegus t.Gl. написал:
Хм… Наткнулся на некоторую проблему (не знаю пока, насколько серьёзную) с реализацией чекпоинтов. А именно — момент сохранения чекпоинта.
Решил проблему.
Исходил из следующих соображений: по сути, точка сохранения состояния игры нужна не в любом произвольном месте, а после смены состояния игры (что-то произошло), когда управление передаётся игроку. Таким образом я у себя вычислил всего несколько точек (функций), которые безоговорочно завершают выполнение авторского и служебного кода. То есть в конце этих функций весь служебный и прочий мусор вычищен.
Следовательно мне оказалось достаточно заменить содержимое функции "СоздатьТочкуСохранения" на простое "взведение" флага, что нужно создать чекпоинт, а в конец этих функций (их две-три штуки) дописать уже вызов функции, содержащей "SAVEGAME". И всё.
Кстати, когда я доберусь до оптимизации скорости работы Адского Движка (знакомые с нетбуками жалуются), то можно сделать ещё и кэширование всех изменений на экране и вываливание их всех зараз именно в этих же точках кода. Это должно сэкономить прилично времени на обновление ссылок на экране и всё таком.
Неактивен
Кстати, добавил события и подписки на события.
С одной стороны у меня уже есть обработчики системных событий. То есть на ряд системных событий (например, получение свойства, перемещение объекта и т.п.) можно повесить модуль-обработчик, который будет выполняться при наступлении события. Например, есть объекты "Меч" и "Палица", у которых есть свойство "Урон". А у игрока есть свойство "Ловкость", которое должно увеличивать урон от оружия. Тогда такой вот обработчик:
…ПриПолученииСвойства, 'Игрок', 'Урон', { °Значение = °Значение + …Получить('Игрок:Ловкость') }
увеличит значение урона от объекта на значение ловкости.
P.S. Для простоты я убрал код проверки, что объект, урон которого определяется, находится у игрока.
Однако кроме системных событий теперь есть ещё и авторские.
Например, вот код:
…ПриНаступленииСобытия, 'СигнализацияСработала', '+', '', 'Сигнализация', После, { …Установить, 'Дракон:Спит', НЕТ …Переместить, 0, 'Дракон', '', 'Сокровищница' } …ПриНаступленииСобытия, 'СигнализацияСработала', '+', '', 'Сигнализация', После, { …Переместить, 0, 'Охранник', '', 'Сокровищница' } …ПриПеремещенииОбъекта, ИГРОК, 'Сокровищница', '', Перед, { if …Содержится(0, 'Корона', ИНВЕНТАРЬ, ДА) and …Получить(0, 'Сигнализация:Включена')=ДА { …Установить, 'Сигнализация:Орёт', ДА …ВызватьСобытие, 'СигнализацияСработала', ИГРОК, '', 'Сигнализация', После °Результат = Нельзя } }
Теперь если переместить игрока из "Сокровищницы", то
Как-то так…
Неактивен
Впрочем с этими событиями есть над чем подумать. Например, с небольшими доработками через них можно очень хорошо реализовать функционал, чтобы в одной локации было слышно/видно, что происходит в другой.
Неактивен
Удалось решить старую проблему. Как я уже говорил и показывал, ссылки на объекты в тексте активируются или гасятся в зависимости от наличия объекта в инвентаре, текущей локации и в перечне доступных игроку контейнеров (если он осмотрел сундук, то ссылки на объекты из сундука должны быть активными). Таким образом, стоит игроку перейти в другую локацию, как ссылки на объекты их прежнего местонахождения гасятся. Точно так же, если объект исчезает из игрового окружения, то ссылка на него в предыдущем тексте будет погашена.
Плюс ко всему этому даже если объект присутствует "рядом" — вызывается функция проверки формирования меню. Если меню пустое, то ссылка гасится (всё равно выбирать не из чего).
Всё это хорошо работало, но возникали следующие проблемы:
При всём при этом ещё нужно было отслеживать местонахождение игрока и всё такое.
В общем удалось привести это к единой методологии, что уже хорошо. Мужайтесь, дальше идут подробности.
Добавлена команда "УстановитьДоступностьСсылок", с помощью которой можно указать, ссылка на какой объект в каком месте будет активна (если конечно в меню есть пункты), если игрок находится в этом же месте. То есть когда игрок переходит в другую локацию, ссылка становится неактивной.
Но добавлено кое-что ещё более страшное и малопонятное.
Небольшой экскурс в правила формирования меню: при формировании контекстного меню можно указывать условия использования того или иного пункта. При этом в ссылке в тексте можно указать параметр, с помощью которого можно регулировать состав меню.
Например описание комнаты, где яблока нет, но чувствуется его запах:
В комнате стоит устойчивый запах ((яблок|Яблоко:Запах)).
Описание содержимого шкафа, где находится яблоко:
В шкафу на блюдце лежит ((яблоко|Яблоко)).
В данном случае объектом является "Яблоко", а "Запах" — это параметр, который передаётся в модуль формирования меню. И меню я могу формировать так:
…Добавить, 'Яблоко:Действия', 'Принюхаться', '', {if:©Параметр ='Запах'}, {…ТекстНаЭкран, 'п. Запах усиливается по мере приближения к шкафу.'} …Добавить, 'Яблоко:Действия', 'Осмотреть яблоко', '', {if:©Параметр<>'Запах'}, {…ОписаниеНаЭкран, 'Яблоко'} …Добавить, 'Яблоко:Действия', 'Съесть яблоко', '', {if:©Параметр<>'Запах'}, {…ТекстНаЭкран, 'п. Не стоит — тут явно какой-то подвох!'}
В этом случае при щелчке на ссылке с параметром "Запах" ((яблок|Яблоко:Запах))
я получу меню с одним пунктом "Принюхаться". А при щелчке на яблоке из описания шкафа (где параметра "Запах" нет: ((яблоко|Яблоко))
) — меню уже будет состоять из двух пунктов: "Осмотреть яблоко", "Съесть яблоко".
Но передача в модуль формирования меню параметра была уже давно. Я всё думал, как сократить запись, чтобы мне не приходилось скрупулёзно описывать все условия во всех пунктах. И вот что я добавил: если в описании ссылки написать что-нибудь такое: ((яблок|Яблоко:=Запах))
(то есть в начало параметра было добавлен символ "="), то это послужит фреймворку сигналом, что для данной ссылки нужно отбирать только те пункты, в условиях включения которых в том или ином виде обрабатывается значение параметра (в данном случае "Запах"). И теперь мне достаточно записать код так:
…Добавить, 'Яблоко:Действия', 'Принюхаться', '', {if:©Параметр ='Запах'}, {…ТекстНаЭкран, 'п. Запах усиливается по мере приближения к шкафу.'} …Добавить, 'Яблоко:Действия', 'Осмотреть яблоко', '', '', {…ОписаниеНаЭкран, 'Яблоко'} …Добавить, 'Яблоко:Действия', 'Съесть яблоко', '', '', {…ТекстНаЭкран, 'п. Не стоит — тут явно какой-то подвох!'}
При нажатии на ссылку ((яблок|Яблоко:=Запах))
фреймворк просто обросит пункты "Осмотреть яблоко" и "Съесть яблоко", поскольку в них не обрабатывается параметр "Запах".
Как-то так…
Неактивен
Olegus t.Gl. написал:
то добавил возможность использования сокращённой формы:
Код:
{if:©Параметр='Встать'}
Расширил варианты краткой записи условий:
Дополнительный вариант записи проверки условия: {если:©Параметр='Встать'}
Проверка, находится ли игрок в локации "ВоротаНаБолото": {в:ВоротаНаБолото}
Проверка, попал ли в текущую локацию игрок из локации "ВоротаНаБолото": {из:ВоротаНаБолото}
Зачем это всё? Ах да, я же игру пишу. И возник вопрос, как лучше прописывать переходы из локации в локацию. Получается, когда игрок щёлкает на ссылку на определённую локацию, то меню переходов нужно собирать исходя из местоположения игрока. Вот поэтому всё и так. Пока удобно.
Неактивен
Можешь выложить какой-нибудь пример, пару локаций, которые демонстрируют возможности, описанные в последних двух постах?
Неактивен