Перейти к основному содержимому

19.9. Как обновлять переменные на экране?

В: Как обновлять переменные на экране?

О: Очень частый вопрос, который происходит от непонимания того, в каком порядке плеер выполняет код.

Например, автор пишет вывод здоровья в окне дополнительного описания так:

pl "Ваше здоровье <<health>>/100"

Переменная health в данном случае показывает уровень здоровья главного героя. Далее автор меняет значение переменной

health += 20

И ожидает, что и на экране значение изменится, но в окне дополнительного описания изменения не происходят.

А всё дело в том, что плеер выполняет команды последовательно, а кроме выполнения команд ничего иного делать не умеет.

Когда плеер выполняет команду

pl "Ваше здоровье <<health>>/100"

Происходит следующее:

  1. Плеер видит оператор pl и понимает, что ему нужно вывести некий текст в окно дополнительного описания. Данный текст плееру передан в виде конкретного значения, однако в этом значении присутствует подвыражение "<<health>>" (так же оно называется вложенным выражением).
  2. Плеер "раскрывает" подвыражение. То есть вычисляет его значение и подставляет это значение вместо подвыражения в строку. Например, если значение переменной health в этот момент было равно 50, плеер подставит число 50 вместо подвыражения, и теперь команда будет для него выглядеть так:
    pl "Ваше здоровье 50/100"
  3. Строка передаётся оператору pl, и оператор pl выводит строку в окно дополнительного описания, что собственно и видит игрок.

Что же происходит, когда выполняется команда

health = health + 20

А вот что. Плеер вычисляет значение выражения health+20, подставляя значение переменной health (равно 50), и получает конкретное значение (50+20 равно 70), и уже это конкретное значение возвращает переменной health (теперь в переменной health значение 70). И всё. Здесь нет указания плееру "обновить" значение на экране. Только вычислить.

Чтобы значение в окне дополнительного описания "обновилось", нужно:

  1. Стереть старое значение в окне дополнительного описания
  2. Вывести новое значение в окне дополнительного описания

Простой код для этого:

! меняем значение переменной

health += 20
! стираем весь текст из окна доп.описания

clr
! выводим новый текст на экран

pl "Ваше здоровье <<health>>/100"

Таким образом всякий раз, изменив значение переменной, вам нужно повторно вывести его на экран, чтобы игрок увидел "обновление" этого значения.

qSpider

В qSpider есть специальный HTML-тег qsp-variable, который позволяет автоматически обновлять переменную на экране. Для указанного примера достаточно вывести тег на экран, указав в атрибуте name необходимую переменную:

usehtml = 1
pl 'Ваше здоровье <qsp-variable name="health"></qsp-variable>/100'

И теперь в не зависимости от того, в каком месте кода изменится переменная, пока строка выведена на экран, она будет отображать фактическое значение переменной.