Инструменты пользователя

Инструменты сайта


help:jump

Различия

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

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:jump [2013/11/01 08:58]
newsash
help:jump [2024/10/14 11:42] (текущий)
aleks_versus
Строка 1: Строка 1:
-[[help:​organizing|Назад: ​Упорядочивание кода]] +[[help:​organizing|Назад: ​Пользовательские функции ​и процедуры]]
-=====Переходы внутри локациициклы=====+
  
-JUMP [$выражение] - переход ​в текущем коде (при обработке локации / выбора действия) на метку [$выражение]. Метка на локации ​обозначается как ":​[название метки]"​. После описания метки (через "&"​) могут идти операторы. Если интерпретатор находит случайную метку, то он её просто игнорирует. Например:​+====== Переходы внутри локации ​======
  
 +Иногда нам требуется пропустить выполнение определённого участка кода на локации,​ или вернуться к выполнению уже выполненного участка кода. Для таких случаев в QSP предусмотрен механизм переходов по локальным меткам.
  
 +В общем виде метки выглядят так:
  
-jump 'КонеЦ'+<sxh qsp> 
 +:[название метки] 
 +</​sxh>​
  
-'Это сообщение не будет выведено'+, где ​''​%%[название метки]%%''​ — теоретически любое сочетание ​символов,​ однако на практике желательно использовать лишь ​буквы, цифры, символы подчёркивания и пробелы. Перед двоеточием могут стоять символы пробелов и табуляции в любом количестве. Так же игнорируются прилегающие к названию метки символы пробелов и табуляций (однако ставить их не рекомендуется для удобства чтения кода).
  
-:конец+Иными словами,​ чтобы поставить метку, вам нужно на отдельной строке поставить двоеточие и после двоеточия написать названия метки.
  
-p 'А это сообщение пользователь увидит'​+<sxh qsp> 
 +! пример метки 
 +:​cycle_end 
 +</​sxh>​
  
 +После названия метки можно поставить ''​%%&​%%''​ и написать какие-нибудь операторы,​ однако делать так не рекомендуется.
  
 +<sxh qsp>
 +! допустимо,​ но не рекомендуется
 +:метка & *pl "​Строка текста"​
 +</​sxh>​
  
-С помощью оператора "​JUMP"​ можно организовывать ​циклы:+Метки не должны ​повторяться внутри отдельного блока кода. Если внутри блока кода будут стоять одинаковые метки, плеер будет работать ​только с самой первой меткой,​ все остальные повторяющиеся метки он проигнорирует.
  
 +Названия меток не чувствительны к регистру. То есть метки с названиями "​конец"​ и "​КОНЕЦ"​ — это повторяющиеся метки.
  
 +Метки локальны для отдельных блоков кода. То есть вы можете использовать одинаковые метки в разных блоках кода; например,​ на разных локациях.
  
-s=0+Отдельными блоками кода считаются:​
  
-:loop+  * Код "​Выполнить при посещении"​ любой локации. Каждая локация - это отдельный блок кода. 
 +  * Код действия,​ даже если действие добавлено с помощью оператора ''​%%ACT%%''​. 
 +  * Код в html-ссылке (см. подраздел "​Код в гиперссылках"​ раздела **[[help:html|HTML]]**). 
 +  * Код ''​%%DYNAMIC%%''/''​%%DYNEVAL%%''​
  
-if s<9:+Для перемещения ("​прыжка"​) к меткам используется оператор ''​%%JUMP%%''​:
  
-s=s+1+''​%%JUMP [$метка]%%''​ - переход в текущем блоке кода на метку с названием ''​%%[$метка]%%''​.
  
-pl s+Пример:​
  
-jump 'LOOP'+<sxh qsp> 
 +jump 'КонеЦ' 
 +p '​Это сообщение не будет выведено'​ 
 +:​конец 
 +p 'А это сообщение пользователь увидит'​ 
 +</​sxh>​ 
 + 
 +**Обратите внимание!** Код действия,​ добавленного с помощью оператора ''​%%ACT%%'',​ является отдельным блоком кода, только когда мы нажимаем на действие. Из локации,​ на которой размещено создаваемое с помощью оператора ''​%%ACT%%''​ действие,​ мы по прежнему можем "​прыгнуть"​ на метку внутри этого действия. 
 + 
 +Пример:​ 
 + 
 +<sxh qsp> 
 +:​метка_на_локации 
 +jump '​метка_в_действии'​ & ! отсюда мы можем прыгнуть в код действия
  
 +act "​Действие":​
 +    ! а из действия мы не можем прыгнуть на локацию
 +    jump '​метка_на_локации'​
 +    :​метка_в_действии
 end end
 +</​sxh>​
  
-p '​Всё!'​+===== Циклы =====
  
 +В плеерах с версией библиотеки ниже 5.8.0 с помощью меток были организованы циклы. Сейчас эта практика устарела,​ потому что есть специальный оператор ''​%%LOOP%%'',​ предназначенный для создания циклов. Тем не менее в старых играх вы можете столкнуться с подобными конструкциями,​ поэтому здесь мы приводим примеры таких устаревших циклов,​ и примеры новых циклов,​ которые следует использовать.
  
 +Устаревший цикл для вывода чисел с 1 по 9:
  
-Оператор "​JUMP" ​также полезен во время отладки квеста, чтобы "​обойти"​ группу ​операторов, которые временно не нужны.+<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> <sxh qsp>
 :loop :loop
 if y<y0: if y<y0:
-  ​if x<x0: +    ​if x<x0: 
-    ​............ +        ! тело цикла, код 
-    x=x+1+        x=x+1 
 +        jump '​loop'​ 
 +    end 
 +    y=y+1 
 +    x=0
     jump '​loop'​     jump '​loop'​
-  end 
-  y=y+1 
-  x=0 
-  jump '​loop'​ 
 end end
 </​sxh>​ </​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|Вперёд:​ Служебные локации]]
 +
help/jump.1383296335.txt.gz · Последние изменения: 2013/11/01 12:58 (внешнее изменение)