Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:jump [2015/04/07 08:16] 104.173.64.4 95vWEQIm75P |
help:jump [2024/10/14 11:42] (текущий) aleks_versus |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | Fiinndg this post has solved my problem http://iifeodeol.com [url=http://uwfnsma.com]uwfnsma[/url] [link=http://ldmqiuey.com]ldmqiuey[/link] | + | [[help:organizing|Назад: Пользовательские функции и процедуры]] |
+ | |||
+ | ====== Переходы внутри локации ====== | ||
+ | |||
+ | Иногда нам требуется пропустить выполнение определённого участка кода на локации, или вернуться к выполнению уже выполненного участка кода. Для таких случаев в QSP предусмотрен механизм переходов по локальным меткам. | ||
+ | |||
+ | В общем виде метки выглядят так: | ||
+ | |||
+ | <sxh qsp> | ||
+ | :[название метки] | ||
+ | </sxh> | ||
+ | |||
+ | , где ''%%[название метки]%%'' — теоретически любое сочетание символов, однако на практике желательно использовать лишь буквы, цифры, символы подчёркивания и пробелы. Перед двоеточием могут стоять символы пробелов и табуляции в любом количестве. Так же игнорируются прилегающие к названию метки символы пробелов и табуляций (однако ставить их не рекомендуется для удобства чтения кода). | ||
+ | |||
+ | Иными словами, чтобы поставить метку, вам нужно на отдельной строке поставить двоеточие и после двоеточия написать названия метки. | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! пример метки | ||
+ | :cycle_end | ||
+ | </sxh> | ||
+ | |||
+ | После названия метки можно поставить ''%%&%%'' и написать какие-нибудь операторы, однако делать так не рекомендуется. | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! допустимо, но не рекомендуется | ||
+ | :метка & *pl "Строка текста" | ||
+ | </sxh> | ||
+ | |||
+ | Метки не должны повторяться внутри отдельного блока кода. Если внутри блока кода будут стоять одинаковые метки, плеер будет работать только с самой первой меткой, все остальные повторяющиеся метки он проигнорирует. | ||
+ | |||
+ | Названия меток не чувствительны к регистру. То есть метки с названиями "конец" и "КОНЕЦ" — это повторяющиеся метки. | ||
+ | |||
+ | Метки локальны для отдельных блоков кода. То есть вы можете использовать одинаковые метки в разных блоках кода; например, на разных локациях. | ||
+ | |||
+ | Отдельными блоками кода считаются: | ||
+ | |||
+ | * Код "Выполнить при посещении" любой локации. Каждая локация - это отдельный блок кода. | ||
+ | * Код действия, даже если действие добавлено с помощью оператора ''%%ACT%%''. | ||
+ | * Код в html-ссылке (см. подраздел "Код в гиперссылках" раздела **[[help:html|HTML]]**). | ||
+ | * Код ''%%DYNAMIC%%''/''%%DYNEVAL%%'' | ||
+ | |||
+ | Для перемещения ("прыжка") к меткам используется оператор ''%%JUMP%%'': | ||
+ | |||
+ | ''%%JUMP [$метка]%%'' - переход в текущем блоке кода на метку с названием ''%%[$метка]%%''. | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | <sxh qsp> | ||
+ | jump 'КонеЦ' | ||
+ | p 'Это сообщение не будет выведено' | ||
+ | :конец | ||
+ | p 'А это сообщение пользователь увидит' | ||
+ | </sxh> | ||
+ | |||
+ | **Обратите внимание!** Код действия, добавленного с помощью оператора ''%%ACT%%'', является отдельным блоком кода, только когда мы нажимаем на действие. Из локации, на которой размещено создаваемое с помощью оператора ''%%ACT%%'' действие, мы по прежнему можем "прыгнуть" на метку внутри этого действия. | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | <sxh qsp> | ||
+ | :метка_на_локации | ||
+ | jump 'метка_в_действии' & ! отсюда мы можем прыгнуть в код действия | ||
+ | |||
+ | act "Действие": | ||
+ | ! а из действия мы не можем прыгнуть на локацию | ||
+ | jump 'метка_на_локации' | ||
+ | :метка_в_действии | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | ===== Циклы ===== | ||
+ | |||
+ | В плеерах с версией библиотеки ниже 5.8.0 с помощью меток были организованы циклы. Сейчас эта практика устарела, потому что есть специальный оператор ''%%LOOP%%'', предназначенный для создания циклов. Тем не менее в старых играх вы можете столкнуться с подобными конструкциями, поэтому здесь мы приводим примеры таких устаревших циклов, и примеры новых циклов, которые следует использовать. | ||
+ | |||
+ | Устаревший цикл для вывода чисел с 1 по 9: | ||
+ | |||
+ | <sxh qsp> | ||
+ | s=0 | ||
+ | :loop | ||
+ | if s<9: | ||
+ | s=s+1 | ||
+ | pl s | ||
+ | jump 'loop' | ||
+ | end | ||
+ | p 'Всё!' | ||
+ | </sxh> | ||
+ | |||
+ | Тот же цикл с использованием оператора ''%%LOOP%%'': | ||
+ | |||
+ | <sxh qsp> | ||
+ | loop s=0 while s<9: | ||
+ | s+=1 | ||
+ | pl s | ||
+ | end | ||
+ | p 'Всё!' | ||
+ | </sxh> | ||
+ | |||
+ | Устаревший двойной цикл с одной меткой: | ||
+ | |||
+ | <sxh qsp> | ||
+ | :loop | ||
+ | if y<y0: | ||
+ | if x<x0: | ||
+ | ! тело цикла, код | ||
+ | x=x+1 | ||
+ | jump 'loop' | ||
+ | end | ||
+ | y=y+1 | ||
+ | x=0 | ||
+ | jump 'loop' | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | Тот же двойной цикл с оператором ''%%LOOP%%'': | ||
+ | |||
+ | <sxh qsp> | ||
+ | loop y=0 while y<y0 step y+=1: | ||
+ | loop x=0 while x<x0 step x+=1: | ||
+ | ! тело цикла, код | ||
+ | end | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | Несмотря на то, что метки больше не используются для написания циклов, они могут быть очень полезны, если вам нужно досрочно прервать выполнение цикла. Например, вот цикл, проверяющий, присутствуют ли в двух массивах ''%%$a%%'' и ''%%$b%%'' одинаковые элементы: | ||
+ | |||
+ | <sxh qsp> | ||
+ | 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 | ||
+ | </sxh> | ||
+ | |||
+ | [[help:service_locations|Вперёд: Служебные локации]] |