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

Назад: Пользовательские функции и процедуры

Переходы внутри локации

Иногда нам требуется пропустить выполнение определённого участка кода на локации, или вернуться к выполнению уже выполненного участка кода. Для таких случаев в QSP предусмотрен механизм переходов по локальным меткам.

В общем виде метки выглядят так:

:[название метки]

, где [название метки] — теоретически любое сочетание символов, однако на практике желательно использовать лишь буквы, цифры, символы подчёркивания и пробелы. Перед двоеточием могут стоять символы пробелов и табуляции в любом количестве. Так же игнорируются прилегающие к названию метки символы пробелов и табуляций (однако ставить их не рекомендуется для удобства чтения кода).

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

! пример метки
:cycle_end

После названия метки можно поставить & и написать какие-нибудь операторы, однако делать так не рекомендуется.

! допустимо, но не рекомендуется
:метка & *pl "Строка текста"

Метки не должны повторяться внутри отдельного блока кода. Если внутри блока кода будут стоять одинаковые метки, плеер будет работать только с самой первой меткой, все остальные повторяющиеся метки он проигнорирует.

Названия меток не чувствительны к регистру. То есть метки с названиями "конец" и "КОНЕЦ" — это повторяющиеся метки.

Метки локальны для отдельных блоков кода. То есть вы можете использовать одинаковые метки в разных блоках кода; например, на разных локациях.

Отдельными блоками кода считаются:

  • Код "Выполнить при посещении" любой локации. Каждая локация - это отдельный блок кода.
  • Код действия, даже если действие добавлено с помощью оператора ACT.
  • Код в 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<y0:
if x<x0:
! тело цикла, код
x=x+1
jump 'loop'
end
y=y+1
x=0
jump 'loop'
end

Тот же двойной цикл с оператором LOOP:

loop y=0 while y<y0 step y+=1:
loop x=0 while x<x0 step x+=1:
! тело цикла, код
end
end

Несмотря на то, что метки больше не используются для написания циклов, они могут быть очень полезны, если вам нужно досрочно прервать выполнение цикла. Например, вот цикл, проверяющий, присутствуют ли в двух массивах $a и $b одинаковые элементы:

loop local i,size=0,arrsize('$a') while i<size step i+=1:
if arrpos('$b',$a[i])<>-1:
*pl 'В массивах есть одинаковые элементы'
jump 'cycle_end' & ! ранний выход из цикла
end
end
*pl 'В массивах нет одинаковых элементов'
:cycle_end

Вперёд: Служебные локации