Темы:
Ну, что ж, приступим к написанию нашего первого радара.
Создаем новый объект типа BOX, открываем вкладку "Content" и нажимаем кнопку "New Script...".
В открывшемся окне редактора перед событием state_entry() дописываем новое событие:

Оно будет срабатывать каждый раз, когда объект "появляется на свет", например, при доставании его из сумки или при "надевании" на аватар. Также это событие будет срабатывать каждый раз в том момент, когда вы входите в Second Life (для этого объект должен быть "надет" на вас).
Внутри события мы вызываем удаление текста, сброс и перезагрузку скрипта для того, чтобы он, например, не показывал результаты старых поисков радаром. В принципе, производить сброс в нашем случае не обязательно, так как мы воспользуемся сканированием с интервалами времени, и старые записи будут сохраняться всего на несколько секунд, после чего заменяться новыми, но оставлять это в таком виде не слишком красиво.
В событии state_entry стираем строчку "Hello, Avatar!" и пишем свою:

Так мы включаем сенсор на постоянное сканирование местности в радиусе 96 метров с интервалом в одну секунду и поиск всех агентов в этом радиусе.
Теперь опишем событие sensor:

Переменная i вводится для цикла, в котором будут обрабатываться все найденные агенты; в переменной text скрипт будет собирать их имена для последующего вывода на объект.
В цикле, который перебирает всех найденных агентов, мы воспользовались функцией llDetectedName, возвращающей имя найденного агента или объект; функции необходимо передать порядковый номер найденного агента.
Далее мы специальной эскейп-последовательностью "\n" указываем, что нам в переменной text нужен перевод на новую строку. Это делается для того, чтобы имя каждого найденного агента находилось на новой строке и не сливалось с остальными. После завершения цикла перебора выводим результат на объект функцией llSetText.
Поскольку наш радар может ничего не найти, нужно добавить событие no_sensor:

И, наконец, стираем ранее найденные агенты.
В итоге полностью наш первый скрипт должен выглядеть вот так (example_003):

Нажимаем кнопку "Save", закрываем окно редактора, и в нашем кубике мы должны увидеть примерно следущее:

Радар уже работает! Правда, он не показывает количество метров до обнаруженных агентов, но с этим мы разберемся ниже, сначала давайте наденем его на HUD. Открываем окно редактирования объекта и задаем ему имя, например, RADAR. Забираем его в инвентарь через команду "Take". Открываем инвентарь, находим наш радар в папке "Objects", нажимаем правую кнопку и выбираем "Attach To HUD"->"Bottom Right".

Результат можно увидеть сразу :)

Как видите, наш кубик оказался слишком большой, и его надо уменьшить. Сделаем это, не снимая его с HUD - кликаем на нем правой кнопкой мыши, выбираем "Edit..."; стрелки перемещения и масштабирования нам не видны, они за экраном - покрутите колесико мыши, и экран HUD начнет уменьшаться.

Меняем размер и положение радара на более удобные и не забываем увеличить экран HUD до исходных размеров.
Вернемся к нашему радару и добавим отображение расстояния до агента.
Не снимая его с HUD, входим в меню редатирования. Положение найденного радаром агента можно взять из функции llDetectedPos(i), положение самого радара - из функции llGetPos(), а дальше посчитать растояние между ними по страшной формуле sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2) :). Но эти действия можно упростить и воспользоваться готовой функцией вычисления расстояний float llVecDist(vector v1, vector v2).
В нашем случае это бы смотрелось примерно так:

Т.к. здесь используется тип float, то на выходе мы получим лишнюю точность вплоть до миллиметров, которая нам, в общем-то, не нужна.

Применим функцию округления типа float, вернее, преобразуем его в тип integer. Для этого нам пригодится функция integer llRound(float).
В результате событие сенсора станет таким:

Кликните на рисунок для увеличения
Такое решение вполне соответствует нашим требованиям.
Но все равно идеала мы еще не достигли - приведем наш "формирователь" информации в более компактный вид (оптимизацией я бы это не назвал).
Радар (example_004):

Кликните на рисунок для увеличения
Сохраняем наш скрипт и радуемся результату, радар готов!

Напоминаю, что практически все примеры и готовый радар можно получить здесь - secondlife://Lady Vale/38/209/22 в зеленой коробочке.
|
Карлсон 21:04, 09.07.07 ссылка
поправочка - читал в документации и убедился на своем опыте что: |
|
murzik139 22:28, 21.07.07 ссылка
Рассыпаюсь в комплиментах ! Хоть я и не смыслю в скриптовании абсолютно, это было весьма познавательно. И интересно. |
|
Savaro 23:11, 20.07.08 ссылка
Вкусно но мало, пасибо за гайды |















