Cuando un jugador pasa el mouse sobre un objeto, su descripción se actualizará para mostrar los nombres de los objetos que están debajo de ese objeto.
Esta guía intermedia asume conocimientos básicos de secuencias de comandos lua.
Puede ser útil saber qué hay debajo de un objeto, sin mover el objeto para comprobarlo. Por ejemplo, una pila de fichas en un juego de guerra o cualquier otra pila de fichas.
Esta función utiliza la función onObjectHover() en la API de TTS. Cuando el jugador pasa el mouse sobre un objeto, esta función actualiza la descripción de ese objeto para enumerar los nombres de los objetos debajo de ese objeto. La lista se agrega al final de cualquier descripción que ya esté adjunta al objeto.
Esta función llama a funciones de la biblioteca de cadenas lua, que incluye muchas características interesantes. Puede leer más sobre ellos en el tutorial de la biblioteca de cadenas en la wiki de lua-users.
Esta función funciona mejor si tiene una forma de identificar los objetos en su juego, como las funciones de etiqueta en la API de TTS. Además, los objetos deben tener nombres o alguna otra información que se pueda agregar a la descripción.
La función
función onObjectHover(jugador, obj) si obj y obj.hasTag("Hover") entonces local descrip = obj.getDescription() o '' inicio local = descrip:find('apilado con') si comienza luego descrip = descrip:sub (1, inicio-1) end local hitObjects = { } local stackObjects = { } local pos = obj.getPosition() pos.y = pos.y + 2 hitObjects = Physics.cast({origen = pos, direction = {0 ,-1,0}}) para _, hitobj en ipairs(hitObjects) do if obj ~= hitobj.hit_object and hitobj.hit_object.hasMatchingTag(obj) luego table.insert(stackObjects, hitobj.hit_object) end end if #stackObjects >0 entonces si descrip ~= '' y no descrip:termina con('\n') entonces descrip = descrip..'\n' end descrip = descrip..'apilado con\n' for _, stackobj in ipairs(stackObjects ) do local name = stackobj.getName() o '' descrip = descrip .. name .. '\n' end end if descrip:endsWith('\n') then descrip = descrip:sub(1, -2) end obj.setDescription(descrip) final final
Qué hace la función
La función:
- Comprueba que el mouse está actualmente sobre un objeto ("if obj..."). Sin esto, la función puede arrojar un error.
- Comprueba que el objeto tiene una determinada etiqueta. Debería usar alguna prueba aquí, porque esta función probablemente sea útil solo para algunos de los objetos en su juego.
- Obtiene la descripción del objeto o una cadena vacía si el objeto no tiene una descripción.
- Comprueba si la descripción contiene la frase clave "apilado con". Podría usar cualquier frase aquí, pero la función funciona comprobando esta frase clave, por lo que la frase tiene que ser coherente y tiene que ser algo que de otro modo no aparecería en la descripción de un objeto.
- Si la descripción contiene la frase clave "apilado con", elimina esa frase y todo lo que viene después. (Esa información se agregará más adelante).
- Obtiene la posición del objeto.
- Identifica cualquier otro objeto hacia abajo desde un punto ligeramente por encima del objeto y coloca esos objetos en una tabla llamada hitObjects.
- Comprueba cada objeto en hitObjects. Si el objeto no es el primer objeto y si el objeto tiene una etiqueta que coincide con el primer objeto, entonces el objeto se agrega a una tabla llamada stackObjects.
- Comprueba si hay algo en la tabla stackObjects y, de ser así:
agrega una nueva línea a la descripción del primer objeto (si ya hay texto en la descripción),
agrega la frase clave "apilado con" a la descripción del primer objeto, y
obtiene el nombre de cada objeto en stackObjects, lo agrega a la descripción del primer objeto y agrega una nueva línea. - Elimina la nueva línea desde el final de la descripción del primer objeto, si existe.
- Establece el texto de la descripción del primer objeto.
Las funciones de la biblioteca de cadenas
En resumen, esto es lo que hacen las funciones de la biblioteca de cadenas.
start = descrip:find('apilado con') comprueba si una variable de cadena, descrip, contiene la frase "apilado con", y si es así, devuelve el índice del comienzo de esa frase. En este caso, el índice es la enésima letra en la descripción en la que aparece la "s" en "apilado con". Este número se asigna a la variable inicio.
descrip = descrip:sub(1, start-1) Si start no es nil (es decir, si la frase "apilado con" aparece en descrip), entonces devuelva una nueva cadena que incluya todo en descrip hasta pero sin incluir el índice comienzo. Uno se resta al final para que no se incluya la primera letra de "apilado con". Esta nueva cadena se asigna a la variable descrip y la reemplaza.
not descrip:endsWith('\n') La función extremosCon() no está en la biblioteca de cadenas lua sino que es parte de la biblioteca Moonsharp que usa TTS. Devuelve verdadero si una cadena termina con una frase específica. Aquí, verifica si descrip ya tiene una nueva línea al final, antes de agregar una.
descrip:sub(1, -2) La función a veces termina con una nueva línea adicional al final de la descripción del objeto, lo que parece extraño. Entonces, si descrip termina con una nueva línea (y nada después), descrip:sub(1, -2) devuelve una nueva cadena que incluye todo en descrip hasta las dos últimas letras de la cadena (es decir, '\ n'), y lo asigna a la variable descrip.
Tenga en cuenta que lua no elimina nada de una cadena, sino que devuelve una nueva cadena que no tiene lo que desea eliminar.
Física.cast()
Esta función de la API TTS devuelve una tabla de todos los objetos que existen en un área o dirección determinada. Puede hacer muchas cosas.
Aquí, utiliza principalmente los parámetros predeterminados para proyectar una línea hacia abajo desde el objeto sobre el que se desplaza el mouse. Para este propósito, ayuda establecer el origen de la línea en un valor de 2 por encima del propio objeto. Esto parece funcionar mejor para capturar todo en la pila.
Physics.cast() se describe completamente en la referencia de la API de TTS. Probablemente podría usarse para identificar objetos que rodean (en lugar de debajo) un objeto determinado, pero esta Guía se limita a las líneas proyectadas hacia abajo desde un objeto.
Tenga en cuenta que Physics.cast() identificará cada objeto que intercepte, incluida la mesa de juego y otros objetos incidentales.
Debido a esto, la función verifica que obj ~= hitobj.hit_object, para evitar incluir obj en su propia descripción.
Además, es necesario incluir alguna prueba para incluir solo ciertos objetos en la tabla stackObjects. Aquí, el objeto se incluye si tiene una etiqueta que coincida con el primer objeto.
Solucionando Problemas
Esta función agrega los nombres de los otros objetos a la descripción del primer objeto. Si los objetos en su juego no tienen nombres, use alguna otra información y reemplace la llamada a la función getName().
Esta función deja (es decir, no elimina) la lista de objetos en la descripción del primer objeto.
Esto normalmente no debería ser un problema, porque la descripción solo aparece cuando el mouse pasa sobre el objeto. Y lo primero que hace la función (cuando el mouse pasa sobre un objeto en el grupo relevante) es verificar si la descripción contiene la frase clave "apilado con". Si es así, la función elimina esa frase y todo lo que viene después.
Entonces, si el mouse alguna vez pasa sobre un objeto en el grupo relevante, y no hay ningún objeto relevante debajo, entonces la función restablecerá la descripción del objeto.
Si esto se convierte en un problema, deje un comentario y tal vez la función se pueda corregir para evitarlo.
Eso es todo lo que estamos compartiendo hoy para este Simulador de mesa guía. Esta guía fue originalmente creada y escrita por careymcduff. En caso de que no actualicemos esta guía, puede encontrar la última actualización siguiendo este liga.