LSL - Linden Scripting Language
Trabalhando com Scripts
Parte 2
Monitora: Cintia Caetano
Mestrado
UFF – IC
2009/011
1
Eventos de toque

touch_start(integer c) {} - ocorre sempre que
um usuário clica no objeto que tem o script
anexado.

Touch(integer c){} – refere-se ao momento
entre o pressionar o botão do mouse e liberalo.

Touch_end(){} – é disparado no momento da
liberação do botão do mouse.
2
2
Eventos de toque
default
{
touch_start(integer c)
{
llSay(0, "Inicio de Toque");
}
touch(integer c)
{
llSay(0,"Sendo Tocado");
}
touch_end(integer c)
{
llSay(0,"Fim de Toque");
}
}
3
3
llGetOwner




llGetOwner()
Retorna o valor de uma variável do tipo key
que representa o UUID do proprietário.
Exemplo:
Key dono=llGetOwner();
4
4
llDetectedKey


llDetectedKey(numero);
Função onde obtém-se a UUID de quem esta
tocando nosso objeto.

Ela recebe como parâmetro um valor inteiro,
representando o número de pessoas ou objetos a
qual queremos detectar a chave.

Nota: somos obrigados a declarar uma variável
do tipo integer nos eventos touches.

Uma das funções da variável declarada é
armazenar o número de pessoas que estão
tocando o objeto.
5
5
llDetectedKey

Nota: A variável declara no touch deve ser
passada com parâmetro na função llDetectedKey.

Apresenta o problema de adequação de índices,
pois a variável declarada no touch começa sua
contagem em 1 (nunca menor que isso).

Se eu sou o primeiro a tocar serei o número 1,
mas como a variável declarada no touch começar
em 1, ele me comparará com o número 2.
6
6
llDetectedKey

Exemplo sem adequação de índices :
default
{
touch_start(integer c)
{
llSay(0, "O proprietário é: " + (string)llGetOwner());
llSay(0, "Tocado por: " + (string)llDetectedKey(c));
}
}
7
7
Exercício 3

Scriptar os dois exemplos e verificar a diferença.
default
{
touch_start()
{
llSay(0, "O proprietário é: " + (string)llGetOwner());
llSay(0, "Tocado por: " + (string)llDetectedKey(c-1));
}
}
8
8
llDetectedKey

Outro exemplo:
default
{
touch_start(integer c)
{
integer number = 0;
do
llOwnerSay("A chave de quem me tocou é: " + (string)
llDetectedKey(number));
while(c > ++number);
}
}
9
9
Exercício 4
default
{
touch_start(integer c)
{
key dono=llGetOwner();
key quem_toca=llDetectedKey((c - 1));
if (dono==quem_toca)
{
llSay(0,"Você é o dono do objeto");
}
else
{
llSay(0,"Você não é o dono do objeto");
}
}
}
10
10
llSetTouchText

A função llSetTouchText(string) serve para
adequarmos o nome “touch” ou “tocar” com a
função que realiza.

Ao invés de clicar em tocar para abrir uma
porta, você clica em “Abrir Porta”, isso com
certeza é mais intuitivo.

Atente que somente o nome da opção é
alterado, codificamos os eventos touchs
normalmente.
11
11
llSetTouchText
default
{
state_entry()
{
llSetTouchText("Abre Porta");
}
touch_start(integer c)
{
llSetTouchText("Fecha Porta");
}
}
Quando o objeto é iniciado, altera o nome “touch”
para “Abrir”. Quando “abrimos nossa Porta”, o evento
é alterado touch para alterar a opção para “Fechar”. 12
12
llSetText

llSetText(string, cor, transparência);

Coloca uma etiqueta acima do objeto, com o
nome ou informações adicionais.

Exemplo:
llSetText(“Teste”, <0.0, 1.0, 0.0>, 1.0);
13
13
Cores em SL

Representada por um vetor de floats.

Proporção máxima, <255,255,255>, é a cor
branca. A ausência de todas elas, <0,0,0>, é a
cor preta.

Nota: Se você multiplicar 255*255*255, vai
chegar a um resultado de 16.581.375. Esse
numero gigantesco, é o numero de
tonalidades diferentes que você pode obter
utilizando RGB.
14
14
Cores em SL

No SL alterou a escala padrão RGB, que ao
invés de ir de 0 á 255, vai 0.0 á 1.0.

Então, temos que o branco em SL será
representado por <1.0,1.0,1.0> e o preto por
<0.0,0.0,0.0>.

A transparência varia também de:
 0.0 (transparente total)
 1.0 (nenhuma transparência).
15
15
llGetRegionName / RegionFPS





llGetRegionName();
Esta função retorna uma string contendo o
nome da região onde você se encontra.
llGetRegionFPS();
Retorna um valor do tipo float contendo o FPS
(frames por segundo) da região.
No SL, como a qualidade depende da
conexão, FPS é útil para analisar a quantas
andas a conexão com o servidor da Linden.
16
16
llGetScriptName / llSetObjectName /
llGetObjectName






llGetScriptName();
Retorna uma string contendo o nome do
script.
llSetObjectName(string);
Esta função altera o nome do objeto, a qual
o script esta inserido, para o nome passado
como argumento.
llGetObjectName();
Simplesmente retorna uma string contendo o
nome do objeto a qual o script esta anexado.
17
17
llDie


llDie();
Quando chamada, simplesmente “mata” o
objeto a qual está anexada.

É como se deletasse o objeto, porém o objeto
não retorna ao inventario, é literalmente
destruído.

Nota: Esta é uma função que pode ser
utilizada quando se planeja construir armas.
18
18
llSleep

llSleep(segundos)
Faz o script “dormir” (ou atrasar) pelo tempo
em segundos passado como parâmetro.

É como inserir um delay em nosso script.

19
19
Evento Timer



Timer(){...}
Esse é um evento que é ativado e ajustado
por llSetTimerEvent(segundos).
Este evento é disparado periodicamente, e
então executa o código entre as chaves.
20
20
llSetTimerEvent


llSetTimerEvent(segundos);
Assim como llListen, o llSetTimerEvent ativa e
configura um evento timer

Ele respondera em um intervalo de tempo
dado pelo valor passado como argumento da
função.

O tempo informado é em segundos, e um
argumento de 0.0 segundos significa
desativar o evento timer.
21
21
Exercício 5
default
{
state_entry()
{
llOwnerSay("Primeira Mensagem");
llSetTimerEvent(2.0);
}
timer()
{
llOwnerSay("2 Segundos se passaram
desde a ultima mensagem");
}
}
22
22
llResetTimer / llGetTime /
llGetAndResetTime






llResetTime()
Reinicia o relógio do Script.
llGetTime();
Retorna um float contendo o tempo em
segundos desde o início do script, ou desde a
última chamada da função llResetTime.
llGetAndResetTime();
Esta função reúne as funcionalidades das
duas anteriores. Retorna um float contendo o
tempo decorrido e reinicia o relógio.
23
23
llResetScript / llRound




llResetScript();
Em algumas situações, pode ser necessário
que o script volte a seu estado inicial, como
se estivéssemos voltando nosso objeto para o
inventario e então utilizando-o novamente.
llRound(valor);
Esta função arredonda o valor passado.
Seguindo a regra matemática de
arredondamento, transforma o tipo float para
inteiro.
24
24
llFrand





llFrand(valor);
Esta função retorna um valor do tipo float,
”aleatório”, no intervalo de 0 ao valor passado
como argumento.
Por exemplo:
llFrand(10.0); //retorna um float que estará entre 0 e 10.
llFrand(3.5); //retorna um float que estará entre 0 e 3.5.
25
25
llFrand
default
{
state_entry()
{
llSetTimerEvent(2.0);
}
timer() {
llSetColor(<llFrand(1.0),llFrand(1.0),llFrand(1.0)>, ALL_SIDES);
}
}
26
26
llDialog






llDialog(pessoa, mensagem, botões, canal);
Esta função abre uma janela de diálogo na
tela da pessoa.
Primeiro parâmetro – Key
Segundo parâmetro – mensagem exibida
Terceiro parâmetro – botões para a pessoa
escolher. São passados na forma de uma lista
de strings.
Quarto parâmetro – quando a pessoa escolhe
e clica em uma das opções, o nome do botão
é dito através do canal.
27
27
llDialog

Vantagens e desvantagens:

Esta função é muito prática, pois evita que a
própria pessoa tenha que dizer, em um
determinado canal, o comando necessário
para que o objeto execute alguma função.

Quem utiliza a caixa de diálogo não precisa ter
a mínima idéia de canal, comandos, etc.

A desvantagem do llDialog() é que possui um
delay de 1.0 segundo.
28
28
llDialog

Observações

Podemos ter, no máximo, 12 botões.

O texto de cada botão deve ser do tipo string.

O texto de cada botão esta limitado a 8
caracteres.

Há a opção de ignorar a janela de diálogo,
mas não temos controle sobre esta opção.
29
29
Exercício 6
key dono; //variável tipo key
default
{
state_entry()
{
llSetText("Toque-me para Informacoes",<1.0,0.0,0.0>,1.0);
llListen(-301,"","",""); //configura canal -301
dono=llGetOwner(); //dono recebe o key do dono do objeto
}
touch_start(integer c)
{
llDialog(dono, "Informacoes", ["FPS","RegionName",
"ScriptName", "NomeObjeto", "MegaSena", "Comparar",
"Destruir"], -301); //cria a caixa de diálogo
}
30
30
Exercício 6
listen(integer canal,string nome,key id,string msg)
{
if(msg=="FPS")
llOwnerSay((string)llGetRegionFPS()); //FPS da região
if(msg=="RegionName")
llOwnerSay(llGetRegionName()); //Nome da região
if(msg=="ScriptName")
llOwnerSay(llGetScriptName()); //Nome do Script
if(msg=="NomeObjeto")
llOwnerSay(llGetObjectName()); //Nome do Objeto
31
31
Exercício 6
//Se selecionar a opção gera palpites da MegaSena
if(msg=="MegaSena")
{
integer c;
string p="";
for(c=0;c<6;c++) //varia até 6, pois são 6 números da MegaSena
{
float x;
integer i;
x=llFrand(6.0); //retorna um valor aleatório entre 0 e 6
x*=10; //tira a vírgula do float
i=llRound(x); //arredonda o valor
p=p + "\t\t" + (string)i; //coloca em p cada valor encontrado
}
llOwnerSay(p); //qdo termina imprime os valores no canal público
}
32
32
Exercício 6
llResetTime(); //Reinicia o relógio do script e executa o FOR com i++
for(i=0; i<999; i++)
{
}
t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora
p=p +"\t\ti++\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p
llResetTime(); //Reinicia o relógio do script e executa o FOR com i=i+1
for(i=0; i<999; i=i + 1)
{
}
t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora
p=p +"\t\ti=i+1\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p
33
33
Exercício 6
llResetTime(); //Reinicia o relógio do script e executa o FOR com i=i+1
for(i=0; i<999; i=i + 1)
{
}
t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora
p=p +"\t\ti=i+1\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p
llResetTime(); //Reinicia o relógio do script e executa o FOR com i+=1
for(i=0; i<999; i+=1)
{
}
t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora
p=p +"\t\ti+=1\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p
llOwnerSay(p);
//Imprime o tempo na tela
}
34
34
Exercício 6
if(msg=="Destruir")
llSetTimerEvent(3.0); //Ativa e configura o evento timer (3 segundos)
}
//Evento Timer
timer()
{
llOwnerSay("Objeto " + llGetObjectName() + “Destruido");
//Comunica que o objeto será destruído
llDie(); //Destrói o objeto
}
}
35
35
Para Casa

A opção “MegaSena”, poderá ocorrer números
repetidos no palpite. Implementar uma
verificação, caso algum número estivesse
repetido, chamar novamente llFrand afim de
obter outro numero e, então, realizar nova
verificação.
36
36
Bibliográfia

Guia de Script no Second Life. By Valdinei Rodrigues dos Reis

Creating Your World: The Official Guide to Advanced Content
Creation for Second Life. by Aimee Weber, Kimberly Rufer-Bach and
Richard Platel. Wiley Publishing, Inc. ISBN: 978-0-470-17114-1

Second Life For Dummies. By Sarah Robbins, Mark Bell. Wiley
Publishing, Inc. ISBN: 978-0-470-18025-9.

Second Life: o Guia Oficial. By A P Watt Ltd. Editora: Ediouro. Ano:
2007. Edição: 1. ISBN: 9788500019616.

LSL Guide

http://wiki.secondlife.com/wiki
37
37
Download

Aula de LSL — Parte 2