[[help:organizing|Назад: Пользовательские функции и процедуры]]
====== Переходы внутри локации ======
Иногда нам требуется пропустить выполнение определённого участка кода на локации, или вернуться к выполнению уже выполненного участка кода. Для таких случаев в QSP предусмотрен механизм переходов по локальным меткам.
В общем виде метки выглядят так:
:[название метки]
, где ''%%[название метки]%%'' — теоретически любое сочетание символов, однако на практике желательно использовать лишь буквы, цифры, символы подчёркивания и пробелы. Перед двоеточием могут стоять символы пробелов и табуляции в любом количестве. Так же игнорируются прилегающие к названию метки символы пробелов и табуляций (однако ставить их не рекомендуется для удобства чтения кода).
Иными словами, чтобы поставить метку, вам нужно на отдельной строке поставить двоеточие и после двоеточия написать названия метки.
! пример метки
:cycle_end
После названия метки можно поставить ''%%&%%'' и написать какие-нибудь операторы, однако делать так не рекомендуется.
! допустимо, но не рекомендуется
:метка & *pl "Строка текста"
Метки не должны повторяться внутри отдельного блока кода. Если внутри блока кода будут стоять одинаковые метки, плеер будет работать только с самой первой меткой, все остальные повторяющиеся метки он проигнорирует.
Названия меток не чувствительны к регистру. То есть метки с названиями "конец" и "КОНЕЦ" — это повторяющиеся метки.
Метки локальны для отдельных блоков кода. То есть вы можете использовать одинаковые метки в разных блоках кода; например, на разных локациях.
Отдельными блоками кода считаются:
* Код "Выполнить при посещении" любой локации. Каждая локация - это отдельный блок кода.
* Код действия, даже если действие добавлено с помощью оператора ''%%ACT%%''.
* Код в html-ссылке (см. подраздел "Код в гиперссылках" раздела **[[help:html|HTML]]**).
* Код ''%%DYNAMIC%%''/''%%DYNEVAL%%''
Для перемещения ("прыжка") к меткам используется оператор ''%%JUMP%%'':
''%%JUMP [$метка]%%'' - переход в текущем блоке кода на метку с названием ''%%[$метка]%%''.
Пример:
jump 'КонеЦ'
p 'Это сообщение не будет выведено'
:конец
p 'А это сообщение пользователь увидит'
**Обратите внимание!** Код действия, добавленного с помощью оператора ''%%ACT%%'', является отдельным блоком кода, только когда мы нажимаем на действие. Из локации, на которой размещено создаваемое с помощью оператора ''%%ACT%%'' действие, мы по прежнему можем "прыгнуть" на метку внутри этого действия.
Пример:
:метка_на_локации
jump 'метка_в_действии' & ! отсюда мы можем прыгнуть в код действия
act "Действие":
! а из действия мы не можем прыгнуть на локацию
jump 'метка_на_локации'
:метка_в_действии
end
===== Циклы =====
В плеерах с версией библиотеки ниже 5.8.0 с помощью меток были организованы циклы. Сейчас эта практика устарела, потому что есть специальный оператор ''%%LOOP%%'', предназначенный для создания циклов. Тем не менее в старых играх вы можете столкнуться с подобными конструкциями, поэтому здесь мы приводим примеры таких устаревших циклов, и примеры новых циклов, которые следует использовать.
Устаревший цикл для вывода чисел с 1 по 9:
s=0
:loop
if s<9:
s=s+1
pl s
jump 'loop'
end
p 'Всё!'
Тот же цикл с использованием оператора ''%%LOOP%%'':
loop s=0 while s<9:
s+=1
pl s
end
p 'Всё!'
Устаревший двойной цикл с одной меткой:
:loop
if y
Тот же двойной цикл с оператором ''%%LOOP%%'':
loop y=0 while y
Несмотря на то, что метки больше не используются для написания циклов, они могут быть очень полезны, если вам нужно досрочно прервать выполнение цикла. Например, вот цикл, проверяющий, присутствуют ли в двух массивах ''%%$a%%'' и ''%%$b%%'' одинаковые элементы:
loop local i,size=0,arrsize('$a') while i-1:
*pl 'В массивах есть одинаковые элементы'
jump 'cycle_end' & ! ранний выход из цикла
end
end
*pl 'В массивах нет одинаковых элементов'
:cycle_end
[[help:service_locations|Вперёд: Служебные локации]]