Здесь показаны различия между двумя версиями данной страницы.
| Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
|
help:objs [2015/04/04 12:34] 195.91.173.17 Тут был спам (см. в истории) |
help:objs [2025/10/03 11:32] (текущий) aleks_versus [Команды для управления предметами] |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| [[help:acts|Назад: Действия]] | [[help:acts|Назад: Действия]] | ||
| - | =====Предметы (инвентарь)===== | ||
| - | Предметы главный герой носит с собой, чтобы применить куда-нибудь. На деньги можно купить оружие, оружием кого-нибудь победить, ключом открыть дверь, и так далее. Герой может нести предметы в руках, в карманах, в заплечном мешке, даже катить, в общем случае говорят "инвентарь". Таким образом, инвентарь - это список всех предметов, что есть у героя в данный момент. | + | ====== Предметы (инвентарь) ====== |
| - | В названиях предметов не важен регистр букв, т.е. "ДеньГи" и "деньги" - один и тот же предмет. | + | Очень часто главному герою даётся возможность носить с собой разные предметы, которые можно по разному применять в различных ситуациях. Например, на деньги можно купить оружие, оружием кого-нибудь победить, ключом открыть дверь, и так далее. Герой может нести предметы в руках, в карманах, в заплечном мешке, даже катить, но в общем случае говорят, что предметы помещаются в "инвентарь". |
| - | ====Команды==== | + | Иными словами, инвентарь - это список всех предметов, что есть у героя в данный момент. |
| - | * **SHOWOBJS** //[#выражение]// - если значение выражения отлично от 0, то показывает список предметов, иначе скрывает его. | + | В **QSP** предусмотрено отдельное окно для вывода списка предметов, которое так и называется **Окно предметов** (в плеере — **Предметы**). Иногда его называют **Списком предметов**, **Инвентарём** или **Рюкзаком**. С этим окном, в зависимости от нужд вашей игры, вы можете проделывать разные манипуляции. Вы можете: |
| - | * **ADD OBJ** //[$название]//**,**//[$путь к файлу изображения]//**,**//[#индекс]// или | + | * Отключать и включать **Окно предметов** по своему желанию |
| - | * **ADDOBJ** //[$название]//**,**//[$путь к файлу изображения]//**,**//[#индекс]// - добавление предмета с названием //[$название]// и изображением //[$путь к файлу изображения]// в инвентарь на место с номером //[#индекс]//. | + | * Добавлять предметы в **Окно предметов** |
| - | * Параметр //[$индекс]// может отсутствовать. По умолчанию предметы добавляются в конец списка. | + | * Удалять предметы из **Окна предметов** |
| - | * Индексация предметов рюкзака ведётся с 1. | + | * Полностью очищать **Окно предметов** |
| - | * Параметр //[$путь к файлу изображения]// может отсутствовать, значение по умолчанию - %%''%%. | + | |
| - | * Обратите внимание - для использования одинаковых предметов инвентаря, например денег, патронов и т.п., лучше использовать дополнительную переменную, обозначающую количество этих предметов, чтобы не загромождать инвентарь списком из 137 предметов Рубль / Патрон. Для хранения числа предметов можно использовать массивы, индексируемые через строки:<sxh qsp> | + | ===== Команды для работы с Окном предметов ===== |
| + | |||
| + | ==== Включение и выключение Окна предметов ==== | ||
| + | |||
| + | * **''SHOWOBJS [#выражение]''** - если значение выражения отлично от 0, то показывает **Список предметов**, иначе скрывает его. Пример: <sxh qsp> | ||
| + | showobjs 0 & ! скрываем Окно предметов | ||
| + | showobjs 1 & ! выводим Окно предметов на экран | ||
| + | </sxh> Для удобства чтения кода можно заранее определить переменные **''on''** и **''off''** с соответствующими значениями: <sxh qsp> | ||
| + | on,off = 1,0 | ||
| + | showobjs on & ! включаем Окно предметов | ||
| + | showobjs off & ! выключаем Окно предметов | ||
| + | </sxh> | ||
| + | |||
| + | ==== Команды для управления предметами ==== | ||
| + | |||
| + | * ''**ADDOBJ** [$название],[$путь к файлу изображения],[#индекс]'' - добавление предмета с названием ''[$название]'' и изображением ''[$путь к файлу изображения]'' в **Инвентарь**, на место с номером ''[#индекс]''. Пример: <sxh qsp> | ||
| + | ! добавляем в четвёртую позицию предмет с названием "Апельсин" и картинкой | ||
| + | addobj 'Апельсин','image/orange.png',4 | ||
| + | </sxh> | ||
| + | * Предметы можно добавлять только в уже существующие позиции, либо в конец списка. Например, если вы уже добавили три предмета в список, вы можете указать для добавляения четвёртого предмета только позиции 1, 2, 3 и 4; если вы укажете больший номер позиции, то предмет просто не добавится. | ||
| + | * Параметр ''[#индекс]'' может отсутствовать. По умолчанию предметы добавляются в конец списка. <sxh qsp> | ||
| + | ! в конец списка добавляем предмет "Отвёртка" | ||
| + | addobj 'Отвёртка' | ||
| + | </sxh> | ||
| + | * Индексация (нумерация) предметов в **Окне предметов** начинается с 1: <sxh qsp> | ||
| + | ! добавляем предмет с картинкой в начало списка | ||
| + | addobj 'Гаечный ключ','image/wrench.png',1 | ||
| + | </sxh> | ||
| + | * Параметр ''[$путь к файлу изображения]'' может отсутствовать, значение по умолчанию - ''""'' (пустая строка). <sxh qsp> | ||
| + | ! добавляем предмет без картинки в конец списка | ||
| + | addobj 'Радиоактивный пепел' | ||
| + | ! добавляем предмет без картинки в начало списка | ||
| + | addobj 'Светящийся шар','',1 | ||
| + | </sxh> | ||
| + | * В названиях предметов не важен регистр букв, т.е. "ДеньГи" и "деньги" - один и тот же предмет. | ||
| + | * Обратите внимание - для использования одинаковых предметов инвентаря, например денег, патронов и т.п., лучше использовать дополнительную переменную, обозначающую количество этих предметов, чтобы не загромождать инвентарь списком из 137 предметов Рубль/Патрон. <sxh qsp> | ||
| + | ! действие, которое добавляет предмет "Патроны" лишь в том случае, | ||
| + | ! если у героя нет ещё ни одного патрона | ||
| + | act "Взять десять патронов": | ||
| + | if no obj("Патроны"): | ||
| + | addobj "Патроны" | ||
| + | end | ||
| + | патроны += 10 & ! увеличиваем число патронов у героя | ||
| + | end | ||
| + | </sxh> Для хранения числа предметов можно использовать массивы, индексируемые через строки: <sxh qsp> | ||
| + | ! так мы добавляем сами предметы | ||
| + | addobj "Деньги" | ||
| + | addobj "Патроны" | ||
| + | ! так мы помещаем число этих предметов в массив | ||
| OBJECTS['деньги'] = 12 | OBJECTS['деньги'] = 12 | ||
| OBJECTS['патроны'] = 137 | OBJECTS['патроны'] = 137 | ||
| + | ! а так мы выводим предметы и их количество на экран: | ||
| + | loop i=1 while i < countobj+1 step i += 1: | ||
| + | *pl $getobj(i)+' (<<OBJECTS[$lcase($getobj(i))]>> шт.)' | ||
| + | end | ||
| + | </sxh> | ||
| + | * ''**DELOBJ** [$название], [#количество]'' - удаление предмета из **Окна предметов** по названию. Если существует предмет с названием ''[$название]'', он будет удалён. Если указан аргумент ''[#количество]'', удалится только указанное количество одноимённых предметов. Если аргумент не указан, удалится один самый первый предмет с указанным названием.<sxh qsp> | ||
| + | delobj "Апельсин" & ! удаляем предмет с названием "Апельсин" | ||
| + | delobj "Яблоко", 7 & ! удаляем семь предметов с названием "Яблоко" | ||
| + | </sxh> | ||
| + | * ''**KILLOBJ** [#номер]'' - удаление предмета по номеру в **Списке предметов**. Если параметр ''[#номер]'' не указан, то полная очистка **Окна предметов**. <sxh qsp> | ||
| + | killobj 3 & ! удаляем предмет из третьей позиции, не важно, как он называется | ||
| + | </sxh> | ||
| + | * Индексация (нумерация) предметов в **Окне предметов** начинается с 1. | ||
| + | * ''**MODOBJ** [$название], [$описание], [$изображение]'' - замена описания (текста) предмета с названием ''[$название]'' и его изображения на указанные. | ||
| + | * Данная операция помогает легко заменять отображаемое наименование предмета и его иконку в окне предметов. При этом название предмета не меняется, то есть ''$selobj'' продолжает возвращать название предмета, которое было использовано при создании предмета командой ''ADDOBJ''. Пример: <sxh qsp> | ||
| + | addobj "Апельсин" & ! создаём предмет "Апельсин" | ||
| + | modobj "Апельсин", "Апельсин (1 шт.)" & ! заменяем отображаемое наименование | ||
| + | ! на экране видим "Апельсин (1 шт.)", но когда кликаем по этому предмету: | ||
| + | *pl $selobj & ! $selobj возвращает "Апельсин" | ||
| + | </sxh> | ||
| + | * **Обратите внимание!!!** Если вы добавили в окно предметов несколько предметов с одинаковыми названиями, при использовании ''modobj'' отображаемое наименование поменяется у всех предметов. | ||
| + | * Практический смысл данного оператора заключается в том, чтобы не проводить поиск, получение позиции, удаление старого предмета и замену его новым, если вы делаете "стакающиеся" предметы. Достаточно просто заменить отображаемое наименование (title) предмета на нужный с помощью данного оператора. | ||
| + | * ''**RESETOBJ** [$название]'' — сбрасывает отображаемое наименование и иконку предметов с названием ''[$название]'' до состояния на момент добавления с помощью ''ADDOBJ''. | ||
| + | ==== Команды очистки Окна предметов ==== | ||
| - | 'Количество: <<OBJECTS[$getobj(countobj)]>>' | + | * **''KILLOBJ''** - данная команда без указания параметров удаляет все предметы из **Окна предметов**. <sxh qsp> |
| + | killobj & ! очищаем Окно предметов | ||
| + | </sxh> | ||
| + | * Можно указать номер предмета, тогда данная команда удалит предмет в указанной позиции: <sxh qsp> | ||
| + | killobj 5 & ! удаляем из списка пятый предмет | ||
| </sxh> | </sxh> | ||
| - | * **DELOBJ** //[$название]// или **DEL OBJ** //[$название]// - удаление предмета из рюкзака, если таковой имеется. | ||
| - | * **KILLOBJ** //[#номер]// - удаление предмета, расположенного в заданной позиции. Если параметр [#номер] не указан, то очистка рюкзака. | ||
| - | * Индексация предметов рюкзака ведётся с 1. | ||
| - | * **KILLALL** - эквивалентен конструкции "KILLVAR & KILLOBJ". | ||
| - | * **COUNTOBJ** - функция возвращает количество предметов в рюкзаке. | + | * **''KILLALL''** - данная команда эквивалентна конструкции "**''KILLVAR & KILLOBJ''**", т.е. очищает **Окно предметов** и уничтожает все переменные игры. |
| - | * **GETOBJ(**//[#номер]//**)** - возвращает название предмета в рюкзаке, расположенного в заданной позиции. | + | |
| - | * Индексация предметов рюкзака ведётся с 1. | + | |
| - | * Если предмета с заданным индексом не существует, возвращается пустая строка (''). | + | |
| - | * //Примеры://<sxh qsp> | + | |
| - | !Первый предмет в списке | + | |
| - | GETOBJ(1) | + | |
| - | !Последний предмет в списке | + | ==== Функции для обработки предметов ==== |
| - | GETOBJ(COUNTOBJ) | + | |
| + | * **''$SELOBJ''** - возвращает название выделенного предмета **в любом месте игры**. Выделение предмета происходит в момент нажатия (щелчка мышью по предмету) и не снимается до применения команды **''UNSELECT''**. | ||
| + | * **''COUNTOBJ''** - функция возвращает количество предметов в рюкзаке. | ||
| + | * ''**$GETOBJ**([#номер])'' - возвращает название предмета в рюкзаке, расположенного в заданной позиции. | ||
| + | * Индексация предметов рюкзака ведётся с 1. | ||
| + | * Если предмета с заданным индексом не существует, возвращается пустая строка (''%%""%%''). | ||
| + | * Примеры: <sxh qsp> | ||
| + | $getobj(1) & ! вернёт название первого предмета в рюкзаке | ||
| + | $getobj(countobj) & ! вернёт название последнего добавленного предмета | ||
| + | </sxh> | ||
| + | * **''$CUROBJS''** - данная функция возвращает список выведенных на экран предметов в виде QSP-кода. | ||
| + | * Предметы сохраняются в виде набора операторов **''ADDOBJ''** с ответствующими параметрами и операциями. | ||
| + | * Записав возвращённое функцией значение в переменную, можно восстановить предметы с помощью оператора **[[help:dynamical|DYNAMIC]]**. Пример: <sxh qsp> | ||
| + | ! сохраняем список предметов как код QSP: | ||
| + | $old_objects = $CUROBJS | ||
| + | ! удаляем все предметы из окна предметов: | ||
| + | KILLOBJ | ||
| + | ! восстанавливаем все предметы в окне предметов: | ||
| + | DYNAMIC $old_objects | ||
| + | </sxh> | ||
| + | * ''**OBJ** [$название]'' - возвращает число одинаковых предметов с названием ''%%[$название]%%'' в **Инвентаре**. <sxh qsp> | ||
| + | addobj "Отвёртка" | ||
| + | *pl obj "Отвёртка" & ! на экране будет число 1, так как предмет **Отвёртка** есть в окне предметов | ||
| + | *pl obj "Апельсин" &! на экране будет число 0, так как предмета **Апельсин** нет в окне предметов | ||
| + | if obj "Отвёртка": | ||
| + | *pl "У вас есть отвёртка." | ||
| + | else | ||
| + | *pl "У вас нет отвёртки." | ||
| + | end | ||
| </sxh> | </sxh> | ||
| - | Код, подсчитывающий в массиве OBJECTS число предметов с одинаковым названием:<sxh qsp> | + | ==== Снять выделение с предмета ==== |
| - | i = 1 | + | |
| - | :loop | + | Предметы в **QSP** выделяются с помощью нажатия (щелчка "мышью" по предмету), и выделение не снимается до применения специальной команды: |
| - | IF i <= COUNTOBJ: | + | |
| - | OBJECTS[$GETOBJ(i)] = OBJECTS[$GETOBJ(i)] + 1 | + | * **''UNSELECT''** — снимает выделение с предмета в **Окне предметов**. Имеет краткую форму **''UNSEL''**. |
| - | i = i + 1 | + | |
| - | JUMP 'loop' | + | ===== Другие примеры: ===== |
| - | END | + | |
| + | Код, подсчитывающий в массиве **OBJECTS** число предметов с одинаковыми названиями: | ||
| + | |||
| + | <sxh qsp> | ||
| + | local i = 1 | ||
| + | loop while i <= countobj step i += 1: | ||
| + | OBJECTS[$GETOBJ(i)] += 1 | ||
| + | end | ||
| </sxh> | </sxh> | ||
| - | Cм. также служебные локации: [[help:service_locations|$ONOBJADD]], [[help:service_locations|$ONOBJDEL]], [[help:service_locations|$ONOBJSEL]]. | + | ===== Событие "Выделение предмета" ===== |
| + | |||
| + | Когда вы щёлкаете мышью по предмету, в классическом плеере этот предмет подсвечивается голубым цветом, и это означает, что предмет становится выделенным. При этом функция **''$SELOBJ''**, вызванная в любом месте игры, будет возвращать название такого выделенного предмета. | ||
| + | |||
| + | **Выделение предмета** — это событие, которое происходит в момент нажатия на предмет, и к этому событию вы можете привязать автоматическое выполнение кода. Делается это с помощью системной переменной **''$ONOBJSEL''**: | ||
| + | |||
| + | * **''$ONOBJSEL''** — системная переменная, куда можно прописать название локации, код на которой будет выполняться при очередном выделении предмета. | ||
| + | |||
| + | Более подробная информация в разделе [[help:service_locations|"Служебные локации"]]. | ||
| + | |||
| + | Если предмет уже выделен, повторное выделение при нажатии не происходит. Чтобы повторно выделить предмет, нужно предварительно снять с него выделение с помощью команды **''UNSELECT''**. | ||
| + | |||
| + | [[help:principle|Вперёд: Порядок работы интерпретатора]] | ||
| - | ---- | ||
| - | [[help:menu|Вперёд: Меню]] | ||