Cómo mover y cambiar de tamaño zonas (versión turborresumida

Anuncio
Cómo mover y cambiar de tamaño zonas (versión turborresumida, ya llegará la versión completa en el turboTutorial de LUA) Intro Lo primero que hay que saber es que LUA trabaja con identificadores, no con nombres. Así que cada zona tiene que tener su identificador único. Otra cosa que hay que saber es que cada cosa que haya en el cartucho, siempre tiene más propiedades ocultas de las que aparecen en Urwigo. Para el caso que nos ocupa (zonas), en Urwigo puedes cambiar el nombre, descripción, identificador, los puntos… pero no viene por ejemplo el OriginalPoint. El OriginalPoint de una zona es un punto que se genera en el centro geométrico de la zona, y es muy importante. Se puede cambiar desde LUA. Generar una zona de forma matemática Vamos a aprender a generar una zona de forma matemática. Para ello, vamos a usar la función interna de wherigo llamada Wherigo.TranslatePoint(puntoRef,distancia,rumbo). Esta función lo que hace es generar un nuevo punto, trasladando puntoRef una distancia según un rumbo. En wherigo, las distancias no son un simple número, ya que tienen unidades (pueden ser 20 m, 20 km…). Por lo tanto, hay que “convertir a distancia” antes de usar un número como tal. No hace falta que la zona de origen que vamos a transformar tenga el mismo número de puntos que queremos que tenga una vez transformada. Vamos a generar un círculo: Vayamos paso por paso: 
function GENERAR_CIRCULO(zona,radio) Es la definición de la función que usaremos para generar círculos. Lo que hace es coger la zona “zona” y convertirla en un círculo de radio “radio”. 


local distancia=Wherigo.distance(radio, ‘m’) Creamos una variable local llamada distancia, y la convertimos a tipo medida. Su valor es igual a radio, y está expresada en metros. zona.Points={ … } Creamos un array. Dicho array representará los puntos de zona. ¿Qué puntos están dentro de ese array? Pues traslaciones de zona.OriginalPoint, una distancia, y un rumbo. Fíjate que hacemos un punto cada 20º, por lo que al final quedará un círculo bastante redondo. Si hiciéramos 36 puntos, uno cada 10º, quedaría más redondo, pero claro, consumiría más. zona.Active=false, zona.Active=true Para que whereyougo registre el cambio, la zona ha de ser desactivada y activada tras los cambios de puntos. Si estaba desactivada de origen, pues cuando la actives, estarán hechos los cambios. Si te das cuenta, como esta es una forma geométrica simple, podríamos haber hecho dos bucles que habrían quedado turbo guapos: Mover una zona Mover una zona parece muy difícil, pero es lo más sencillo del universo. Como has visto en el ejemplo del círculo, los puntos los hemos generado desde el OriginalPoint. Si movemos el OriginalPoint a otro lado, cuando generemos la zona se generará desde el nuevo OriginalPoint. Podemos hacer un Timer tipo “Interval”, que cada x segundos mueva el OriginalPoint en un rumbo una distancia, y después genere de nuevo el círculo (o que se mueva con cualquier otro evento, no sólo por Timer): Como puedes ver, cuando el timer se acaba, se mueve el Origen de ZonaPrueba 10 m con rumbo 90º. Luego, genera el círculo desde ese nuevo origen, con radio 50. ¿Y si quiero que la zona se mueva con una trayectoria determinada? Pues lo que hacemos en ese caso es una zona cuyos puntos definirán la trayectoria. Por ejemplo, imaginemos que creo una zona identificada como “Trayectoria”, que tiene 20 puntos: Nuestra ZonaPrueba, se moverá por cada uno de los puntos de Trayectoria (¡Pac‐man!). Para ello, volveré a usar el Timer tipo Interval (repito que puede ser cualquier evento). Cada vez que haga un On elapse, moverá el ZonaPrueba.OriginalPoint al siguiente punto de Trayectoria. Vamos a crear una variable numérica que se llame “Posición en la trayectoria”, identificada como “PosTrayectoria”. Inicialmente, esa variable tomará el valor 1 (nuestro círculo comienza en el primer punto de la trayectoria), y cada On elapse, dicha variable se incrementará en 1 (el círculo avanzará al siguiente punto de la trayectoria). Cuando PosTrayectoria llegue a 21 tomará el valor 1 otra vez (la trayectoria tenía 20 puntos nada más), para que esté permanentemente dando vueltas a la Trayectoria: ¿Y si lo que quiero no es usar una forma geométrica simple, sino un dibujo chungo que te cagas? Te habrás dado cuenta que usar un círculo es muy fácil, porque el radio es constante, y los rumbos son pues 10,20,30,40, etc… pero… ¿y si el dibujo es chungo que te cagas? Bueno… es lo mismo. Lo que pasa es que hay que conocer antes las distancias y los rumbos desde el OriginalPoint hasta cada punto del dibujo… ¿Cómo hacemos eso? Consideremos la siguiente zona de 14 puntos, identificada como “Explosion”: Haremos uso de la función interna de wherigo Wherigo.VectorToPoint(punto1,punto2). Esta función lo que hace es dar una distancia y un rumbo entre un punto1 y un punto2. Yo lo hago así: Esto lo que hace es calcular el rumbo y distancia desde el OriginalPoint a cada uno de los puntos de la zona. En este caso, la zona tiene 14 puntos. la función print lo que hace es imprimir el valor de rumbo y distancia en la consola de DEBUG de urwigo, de tal forma que cuando llamo a esa función tendré un output como este: Ahora conozco los rumbos y distancias desde el OriginalPoint hasta cada uno de los puntos de mi dibujo. Por lo tanto, puedo hacer lo siguiente: Ya de paso, acabo de introducir el concepto de reescalar y de girar, ya que como ves, las distancias están multiplicadas por un factor, y los rumbos están sumados a un giro. Cuando haces la llamada a la función estableces ese factor y ese giro, para poder cambiar la zona al gusto. En este caso, convierto ZonaPrueba en el dibujo de la explosión, pero 4 veces más grande y girado 15º. Bueno, hay mil cosas más que se pueden hacer, por ejemplo, para hacer que una zona se mueva y persiga al jugador, se puede calcular el rumbo con Wherigo.VectorToPoint(zona.OriginalPoint, Player.ObjectLocation). Esto nos daría el rumbo entre el original point de la zona y la localización del jugador. Si se calcula dicho rumbo justo antes de mover la zona, la zona se moverá hacia el jugador (zombies!!) No me he querido meter demasiado en el tema de la sintaxis de LUA, simplemente en los procedimientos para resolver los distintos problemas que nos hemos planteado. Con tiempo y una caña, haré un tutorial más exhaustivo. 
Descargar