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