Темы:
touch_start, llDetectedName
В первой части мы в подробностях рассмотрели создание самого простого скрипта LSL. При сбросе он произносил в общий чат "Hello, Avatar!", а при прикосновении говорил "Touched".

Рис.1
Попробуем немного усложнить наш скрипт. Например, сделаем так, чтобы при прикосновении к объекту он говорил "Hello" и добавлял при этом имя того, кто к нему прикоснулся. Для начала нам нужно более детально познакомиться с событием touch_start().
Вообще, существует три события, связанных с прикосновением к объекту:
- touch() - выполняется, когда пользователь кликнул на объект;
- touch_start() - выполняется, когда пользователь начал прикосновение к объекту;
- touch_end() - выполняется, когда пользователь закончил прикосновение к объекту.
Теоретически нам подошел бы обычный touch(), но разработчики не рекомендуют им пользоваться. Связано это с какими-то ошибками в реализации и большой вероятностью задержки при выполнении. Во избежание подобных проблем лучше пользоваться именно событием touch_start(). Подробную информацию о нем вы сможете найти здесь.
Событие touch_start()
Синтаксис: touch_start(integer num_detected)
Описание: это событие, которое может быть вызвано многократно во время прикосновения (клика) пользователя (агента) на объект, содержащий скрипт. Общее количество агентов, начавших прикосновение, передается событию в параметре num_detected. Информация об агентах может быть собрана с помощью функций llDetected*. Одну из них мы рассмотрим ниже.
* Коснуться означает кликнуть на объект, а не наступить на него, врезаться или удариться головой. Для этого существуют соответствующие события коллизий (столкновений).

Рис. 2
Помимо отработки прикосновения к объекту нам еще понадобится узнать, кто именно к нему прикоснулся. Для этого нам как раз пригодятся функции llDetected*, в частности, функция llDetectedName.
Функция llDetectedName
Синтаксис: string llDetectedName(integer number)
Описание: возвращает имя обнаруженного объекта под номером number. Возвратит пустую строку, если number не является действительным объектом. Если выявленная цель выходит за пределы региона или прекращает свое существование, то функция возвращает ключ цели вместо названия.
Как видим, функции нужно передать некоторые параметры перед вызовом. Мы подразумеваем, что только один агент прикоснулся к объекту, поэтому нужно вызвать функцию с первым прикоснувшимся к нему агентом. Нумерация целей в функциях llDetected* начинается с 0, то есть наш вызов должен выглядеть так: llDetectedName(0).
Все исходные данные для создания скрипта мы получили. Попробуем теперь выполнить все то, что мы теперь знаем. Создадим новый объект и скрипт, откроем скрипт на редактирование (смотрите LSL. Основы. Часть 1). В событии touch_start() сотрем команду:
llSay(0, "Touched.");
и напишем свою:
llSay(0,"Hello, "+llDetectedName(0));
В результате наш скрипт полностью должен смотреться вот так:

Рис. 3
Нажимаем кнопку Save и закрываем окно редактирования скрипта и объекта. Проверяем работу скрипта - кликаем на объект или в круглом меню объекта выбираем команду Touch. В ответ объект напишет в общий чат приветствие с вашим именем.

Рис. 4

Рис. 5
Ну, как? Все работает? Поздравляю!
Это нужно знать!
В языке LSL очень важен регистр букв – как в названиях функций, так и в именах переменных. Иначе говоря, LSL регистрозависим! Например, если вы напишите название функции правильно, но промахнетесь с выбором регистра для буквы N в слове Name, то редактор не будет подсвечивать такую функцию и при выборе команды Save выдаст ошибку:

Рис. 6

Рис. 7
Ошибка не обязательно будет описана именно так, но она будет! Следите за подсветкой синтаксиса и уделяйте особое внимание регистру в переменных!
Также время от времени настоятельно рекомендую сохранять скрипты и не забывать при этом брать копию объекта со скриптом к себе в инвентарь. Это можно сделать через круглое меню объекта, выбрав More>

Рис. 8
и затем Take Copy.

Рис. 9
Потому что, если в этот момент полностью упадет симулятор или, например, начнется гриферская атака, которая также может привести к падению симулятора, вы с очень большой вероятностью рискуете потерять свой объект и весь код, который вами написан. Не пренебрегайте этим правилом – я и сам попадал в ситуации, когда симулятор падал, и я терял все, что лежало на земле и не успел сохранить или сделать копию.
Если же вы не хотите сохранять скрипт по причине нежелания допустить автоматический запуск скрипта, то можно сделать следующее. В правом нижнем углу редактора вы можете найти галочку с надписью Running, снимите ее, и при сохранении скрипт не будет автоматически запускаться. Главное, не забудьте ее потом поставить обратно.

Рис. 10
Полезные ссылки:
http://www.lslwiki.net/lslwiki/wakka.php?wakka=touch_start
http://www.lslwiki.net/lslwiki/wakka.php?wakka=llDetectedName














