miércoles, 18 de julio de 2007

Manual de LSL - 1 - Estados

Antes de nada, pedir disculpas por la demora en publicar mas artículos en este blog, la falta de tiempo está provocando que desde el comienzo descuide este espacio de desvaríos.

Sin más preámbulos.... antes de publicar mas ejemplos de scripts para SL, debería enfocar el tema de una forma mas amplia para luego ir profundizando paulatinamente, a modo de capítulos encadenados, en las diferentes funcionalidades que permite el LSL, así que sintiéndolo mucho, la segunda parte de "Rotaciones locales y posición relativa" tendrá que esperar un par de entradas.

Cada primitiva (Prim) en SL puede contener scripts, y cada script es completamente autónomo, y aunque hay métodos para comunicarse con otros scripts del mismo prim, o incluso objetos diferentes, cada uno de los script debe tener una estructura autonoma, esto es, que por si solo pueda funcionar, así que los que hayáis programado en lenguajes modulares, olvidaros de realizar un script únicamente con las funciones que utilizarán otros scripts, aquí no hay "includes", si, se pueden separar funciones, pero hay que preparar los scripts para q se comuniquen entre sí.

Un script se compone de estados, disparadores (triggers), variables y funciones. Tanto los estados como los disparadores/eventos van encerrados dentro de los símbolos de llave "{}" así como los bucles y sentencias condicionales.

Un estado contiene eventos, un estado no puede contener otros estados, así como un evento no puede contener otros eventos.



ESTADOS

TODOS los scripts deben tener un estado por defecto, los que ya hayais visto algun script, vereis q todos comienzan con la "instruccion" "default{" SL al encontrarse con un script espera un estado por defecto y comienza a ejecutarlo

Se pueden definir más estados con tan solo escribir "state NombreDelEstado{", y para cambiar de un estado a otro, pues haciendo la respectiva llamada dentro de un evento "state NombreDelEstado;"

No se pueden poner instrucciones o declaraciones de variables dentro de un estado, siempre hay que hacerlo dentro de un disparador/evento.

ejemplo de cambio de estado
default{
touch_start(integer a){
state hola;
}
}

state hola{
state_entry(){
llOwnerSay("Hola, acabo de entrar en el estado hola");
state default;
}
state_exit(){
llOwnerSay("Adios, salgo del estado hola y vuelvo al estado por defecto");
}
}

jueves, 7 de junio de 2007

Delirios de grandeza

Habitualmente suelo googlear en busca de blogs y portales relacionados con Second life para enterarme de las ultimas novedades, cotilleos etc, y de casualidad fui a parar al blog de cierto residente el cual omitiré su nombre y la dirección por no darle más publicidad pues en mi opinión ni se la merece.

Txuk tio, ya estas desvariando, si no quieres darle publicidad ¿porqué vas a escribir una entrada en esta mierda de blog?
...pues por la sencilla razón de tomarlo como ejemplo ante una postura que es bastante común encontrarse en este... ¿juego? ¿chat? emmm en el trasto este de SL.

Este personaje al cual voy a describir, y que quede constancia que es solo mi opinion, tan válida como cualquier otra, no deja de ser alguien al que se le puede aplicar con todas las de la ley la frase "se cree guay y no llega ni a chuli".

Para empezar, su blog es de principio a fin un alegato de la supuesta grandeza de este ser, de lo bueno que es diseñando, pues segun él, es diseñador gráfico en RL, y las entradas en las que no habla de su inconmensurable existencia, es para criticar destructivamente el trabajo de otros.

ehh eeeeh, para el carro, que por lo que se vé, tu sigues los mismos pasos!!!
...en absoluto, yo no me creo ni mejor ni peor que nadie, cada uno sabe de lo que sabe y punto, lo mismo yo podria enseñar algunas nociones de scripting (y no dejo de ser un aprendiz) y la otra persona me podria enseñar como texturizar correctamente, a saber... es imposible abarcar todos los conocimientos, de ahí la belleza del intercambio de información.... continuemos...

He de reconocer que me sorprendió una entrada en la que pretendió iniciar una campaña de donaciones para si mismo, pues al parecer, está en paro en RL y tiene serias deudas.

Efectivamente estar en el paro y con deudas es una putada y de las gordas, y sería una posición muy cobarde y rastrera regocijarse ante las desgracias ajenas, así que no seguiré por ahí, pero llego a las siguientes conclusiones:

  • ¡¡COÑ!!, si es tan increible diseñador grafico... ¿porqué está en el paro?, vaya usted a saber, la vida da muchas vueltas... respuesta: le fueron diagnosticados un par de enfermedades de tipo nervioso, ok, paro + deudas+ enfermedad putadon elevado al cubo, esperemos que mejore su situación
  • ¿campaña de donaciones para sí mismo? bueno, vale, pero puestos a ser altruistas es de cajón colaborar primero con la familia, segundo con las amistades, tercero en beneficio de muchos (vease donaciones de sangre, campañas contra el cancer, la pobreza, etc) y por ultimo y como caso muy remoto, colaborar en el beneficio personal de un individuo concreto.
  • Teniendo deudas y encima embarcandose en proyectos de envergadura en SL, emmm la compra y mantenimiento del terreno en SL no es precisamente barato, mas aún sabiendo q no es nada tangible, mas que un puñado de bytes donde colocar otros bytes.... Eso dice mucho de la escala de prioridades....
Luego, lo mas cachondo de todo, es que critique salvajemente el trabajo de otros.. una de sus últimas entradas se limita a criticar abiertamente una iniciativa singular, un grupo de musica real creado para SL, donde al parecer tocan de verdad mientras lo emiten en SL. Dicha entrada intenta "suavizarse" con un último párrafo (y no pienso usar el manido copy/paste) que viene a decir "si tienen oportunidad de presenciar un "concierto" de ellos, no sean muy duros"

Que viva el cinismo, coño!!! nada nada.. muy señor mío... si, segun usted, tan malo es ese grupo, le animo abiertamente a que monte un grupo y se vea la magnifica calidad, dado que tanto sabe como para echar por tierra y pisotear la iniciativa ajena.

NOTA: no los he escuchado, ni tan siquiera conozco a ninguno de sus integrantes, así que mi alegato no es una defensa hacia ellos, es una crítica ante la crítica, valga la "rebuznancia"

Como comentario final, tan solo una recomendación, deje de ser tan bocazas, pues su voz predominante le impide escuchar, y nunca se sabe de quién se puede aprender algo.



Esto ha sido un claro ejemplo (real) de un perfil bastante común en SL... los delirios de grandeza...
Y me reafirmo en lo que he dicho.... es mejor escuchar a los demás, nunca se sabe de quién se puede aprender algo.

Rotaciones locales y posicion relativa (Capitulo 1)

En muchas ocasiones nos podemos encontrar con el tremendo dolor de cabeza que supone obtener las coordenadas locales de destino en función de las coordenadas del prim principal de un objeto y de su correspondiente rotación.

Una cosa es clara, cuando esas coordenadas van a aplicarse a un prim que pertenece al mismo linkset la solucion es bien sencilla y sin necesidad de andar con calculos y reconversiones, como por ejemplo la apertura de una puerta en una casa, dicha puerta pertenece al mismo linkset de toda la casa, así que la forma sencilla y sin complicaciones es crear un script en el propio prim de la puerta y q sea algo así

default{
    touch(integer param){
        llOwnerSay("rot = " + (string)llGetLocalRot());
        llOwnerSay("pos = " + (string)llGetLocalPos());
    }
}











Explicacion
default{todos los scripts deben contener esta declaración de estado, es obligatoria
touch(integer param){lo contenido dentro de este evento se disparará cada vez que un avatar pulse sobre el objeto
llOwnerSayorden que interpreta el script para enviar un mensaje que solo el dueño del objeto pueda leer, este mensaje saldrá por defecto de color verde en el chat general
"rot = " y "pos = "cadena literal, el llOwnerSay lo dirá tal cual aparezca
(string)función de reconversión de formatos, llOwnerSay, llSay, llShout, ll Whisper y llInstantMessage sólo aceptan mensajes con formato String (cadena de caracteres) por tanto cuando se desee mostrar una variable cuyo tipo no sea "string" habrá q realizar dicha reconversión
+concatenación o suma, si se "suman" sctring, realmente se concatenan( "a" + "b" = "ab") si se suman valores numericos (integer, float...), realizará la consabida suma
llGetLocalRotfuncion que obtiene la rotación del prim hijo respecto a la rotacion el prim principal de un objeto, es decir, la rotación del prim hijo siempre será la misma independientemente de la rotación del todo el conjunto del objeto, esta función solo es válida si el objeto no tiene las propiedades físicas activadas
llGetLocalPosfuncion que cumple semejante cometido a llGetLocalRot, pero en esta ocasion, para averiguar las coordenadas de posicion


Una vez guardado este script, basta con ubicar la puerta y pulsar sobre ella, nos llegarán dos mensajes uno con la posicion y otro con la rotacion relativas segun el prim principal del objeto... volvemos a ubicar y girar la puerta y volvermos a pulsar, y obtenemos de nuevo sendos datos con ligeras variaciones, una vez se tengan, pues ya se aplica el script que convenga como por ejemplo


// coordenadas y rotaciones de ejemplo, poner los valores correctos
rotation rotacionpuertacerrada = <1,0,0,1>;
rotation rotacionpuertaabierta = <0,1,0,1>;
vector posicionpuertacerrada = <1,1,1>;
vector posicionpuertaabierta = <2,2,2>;
integer abierto = FALSE;
default{
    touch(integer param){
        if (abierto){
            llSetLocalRot( rotacionpuertacerrada );
            llSetPos( posicionpuertacerrada );
            abierto = FALSE;
        }else{
            llSetLocalRot( rotacionpuertaabierta );
            llSetPos( posicionpuertaabierta );
            abierto = TRUE;
        }
    }
}









Explicacion
rotation rotacionpuertacerrada = <1,0,0,1>;declaración de variable de tipo rotation, nombre de variable y su valor, las rotaciones son parecidas a los vectores, pero tienen un valor más, al asignar un valor a una variable rotation hay q asegurarse que no se trate de una string
vector posicionpuertacerrada = <1,1,1>;declaración de variable de tipo vector
integer abierto = FALSE;declaración de una variable de tipo integer, y asignando el valor FALSE, las variables de tipo integer también admiten los valores TRUE y FALSE, que no dejan de ser los valores 1 y 0 respectivamente, en muchas ocasiones se utiliza TRUE y FALSE para que se pueda entender mejor el script
if (abierto){esto es un if, una condicion, dado que se está usando los valores TRUE y FALSE, no es necesario comparar el entero con nada, pues si su valor es TRUE (verdadero) entrará dentro de la condicion, si es falso, pasará al "else" en cayo que lo haya
llSetLocalRot( rotacionpuertacerrada );esta función es semejante a llGetLocalRot, pero en este caso, en vez de devolver un valor "rotation" realmente aplica al prim la rotación que se le diga, esta rotación es relativa a la rotación del prim principal.
llSetPos( posicionpuertacerrada );IMPORTANTE, hasta el momento NO existe la funcion llSetLocalPos... realmente la funcion llSetPos aplica la posicion que se le pase a un prim, si este es el prim principal, la posicion será en función a las coordenadas de la region (sim), si el prim es un prim hijo de un objeto, dicha posicion será el sumatorio respecto a las coordenadas del prim principal


Explicación detallada de llSetPos:
si la orden llSetPos está en un script dentro de un prim principal (u objeto de un solo prim) entonces las coordenadas de destino serán respecto a la region entera, eso está claro, pero si dicha orden está contenida en el script de un prim hijo, el destino de dicho prim hijo será el resultado de la suma de las coordenadas del prim principal más las coordenadas q se le pasen, y teniendo siempre en cuenta que al tratarse de un prim hijo, la orientacion de todo el objeto tb influye en el destino

por ejemplo, estamos trabajando en un objeto y queremos q una puerta deslizante (como las que hay en los supermercados) se mueva 1,5 metros respecto al eje LOCAL y, pues entonces la función será llSetPos(<0,1.5,0>) siempre y cuando esa puerta forme parte del mismo linkset y no sea un objeto independiente esa puerta funcionará correctamente aunque el "supermercado" cambie de orientación, pues para la puerta, su eje y siempre será el mismo independientemente el eje y de la region... en caso q la puerta sea un objeto independiente pues ya se aplicaría las coordenadas de la region como por ejemplo llSetPos(<195,230,45>) y siempre teniendo en cuenta los ejes de desplazamiento x y z de la region.

viernes, 1 de junio de 2007

printf ("Hello World!\n");

Y otro blog mas con las paridas de un personajillo insignificante con ánimos de protagonismo!!

PUES NO

Echando mano de la manida frase "escribo esto sólo por gusto, y para mí" pues pese a quien le pese, bien podría escribirlo en un papel para luego utilizarlo en la limpieza de las partes pudendas, también es cierto que pretendo poner numerosas guías explicativas y paso a paso para realizar scripts en secondlife, y si bien, guías hay muchas en internet, la verdad es que he encontrado información de utilidad gracias a numerosos blogs, así que considero que es mi deber no romper esa cadena de información...

Si alguna guía le es de utilidad a alguien, este blog habrá merecido la pena, el resto de entradas, pues opiniones personales, y como todos sabemos, "las opiniones son como los culos, todo el mundo tiene uno" ...y el hecho de gustarte o no el culo ajeno ya es problema de uno, así que si alguien se pica, es que ajos come

La tolerancia bien entendida empieza por uno mismo

Despues de haber leido un artículo en diariosl titulado "Unión lesbica en Second Life", no me he podido resistir a escribir una entrada en este recien inaugurado blog (otro mas, como si fueramos pocos!)

Lo que más me ha llamado la atención de dicho articulo son los siguientes párrafos en los cuales me tomo la libertad de remarcar las partes "interesantes":

Se realizan fiestas los jueves y los domingos a las 8pm o las 10pm hora española (13:00 hrs SL) en la Casa grande: Mariposa Resort http://slurl.com/secondlife/Mariposa/95/147/27 . Abiertas a todo público.


Hay sólo unas reglas básicas en el recinto, la primera y más importante, es que, no se admiten chicos, ni solos, ni como invitados. Cuando un chico aparece se le invita amablemente a irse, hay chicas de seguridad que se encargan de ello, si el chico no se va por las buenas es banneado.


Su máxima es mucha diversión y buen rollo con respeto.


Bueno después de este recorrido por el recinto, puedo decir, chicas acercaros a verlo, no importa vuestra condición sexual, realmente, las chicas con las que hable son muy amables y muy simpáticas, nada cerradas.


Personalmente, me es completamente indiferente las preferencias sexuales de cada persona, ni su raza, ni sus creencias ni siquiera sus gustos tienen porqué importar, sí, se puede definir cierto perfil de afinidad con otra persona, pero eso JAMÁS debe suponer motivo de discriminación. Pero eso no quita para que deteste el cinismo patente en los párrafos anteriores.

Cada uno es muy libre de hacer con su parcela de Second Life lo que le venga en gana, pero que luego no vengan con la hipocresia de libertad y respeto mutuo.

La verdad, con posturas así flaco favor le hacen a la comunidad homosexual, pues si realmente lo que buscan, por lo que luchan es por la igualdad de derechos y oportunidades, hay formas mucho mas elegantes de defender la privacidad y protegerse de gente indeseable sin llegar a la necesidad de que justos paguen por pecadores, comportamiento que muchos retrógados (xenofobos, homófobos, misóginos, etc) aplican a los que no sean como ellos, dicho comportamiento que muchos homosexuales sufren en sus propias carnes y una pequeñísima parte de ellos pagan con la misma moneda del talión, por suerte en muchos de estos casos, los que más ruido hacen suele ser una parte minoritaria.