En lugar de usar un botón para activar una acción de guión, simule el entorno del juego de mesa activando una acción de guión colocando una pieza de juego en un mosaico.
Esta guía intermedia asume conocimientos básicos de secuencias de comandos lua.
Por lo general, un mod utilizará un botón para activar una acción de script. Esto funciona bien, pero no está de acuerdo con TTS como simulación de un juego de mesa.
Otro enfoque es usar un mosaico o token personalizado. El jugador puede desencadenar una acción de guión colocando una pieza de juego específica en el mosaico.
Enfoque básico
Este enfoque utiliza la función onCollisionEnter(). Si esta función está incluida en la secuencia de comandos del objeto adjunta a la ficha, se llamará cada vez que una pieza del juego entre en contacto con la ficha.
La función onCollisionEnter() debe estar en la secuencia de comandos del objeto para el mosaico. No funcionará si está en el script global.
Una función simple se ve así:
función onCollisionEnter(collision_info) -- tabla de información de colisión: -- objeto de objeto de colisión -- tabla de puntos de contacto {Vector, ...} -- vector de velocidad relativa pieza local = 'guidaa' -- el guid de la pieza que desencadena la acción guid local = info_colisión .colision_object.getGUID() si guid == pieza luego devuelve Global:call('desiredAction') -- nombre de cadena de la función a llamar end end
Tenga en cuenta que la función se llama cada vez que cualquier objeto hace contacto con el mosaico, por lo que el primer paso de la función debe ser verificar si el objeto que hace contacto es el que debe desencadenar la acción.
En lugar de usar el guid para identificar el objeto que hace contacto, puede usar el nombre, la descripción o las notas gm del objeto usando getName(), getDescription() o getGMNotes() en lugar de getGUID().
Diferentes piezas desencadenan diferentes acciones
Para llevar este enfoque un paso más allá, puede configurar diferentes piezas de juego que desencadenan diferentes acciones cuando se colocan en el mosaico.
Usa una función como esta:
function onCollisionEnter(collision_info) pieza local = {['guidaa'] = 1, ['guidbb'] = 2, ['guidcc'] = 3} -- los guids como claves en la tabla son más fáciles de verificar local guid = colision_info. colisión_objeto.getGUID() local algunos datos -- algunos datos para pasar a la secuencia de comandos global, -- por ejemplo, la acción para desencadenar -- incluir algunos datos como valores en pieza{} si pieza[guid] entonces algunos datos = pieza[guid] -- pasar algunos datos al script global return Global:call('desiredAction', {somedata}) end end
Desencadenar diferentes acciones por ubicación colocada
Yendo más allá, también puede configurar el mosaico para que el jugador pueda desencadenar diferentes acciones al colocar una pieza del juego en diferentes lugares del mosaico del juego.
Por ejemplo, puede diseñar la imagen para que el mosaico se divida en cuatro cuadrantes.
Esta función desencadena diferentes acciones según el cuadrante de la baldosa que se contacte.
function onCollisionEnter(collision_info) local piece = 'guidaa' -- referencia abreviada al obj de contacto local obj = colision_info.collision_object local guid = obj.getGUID() local somedata if guid == piece then -- encuentra el punto medio entre los puntos de contacto local hit1 = self.positionToLocal(obj.contact_points[1] u obj.contact_points[3]) local hit3 = self.positionToLocal(obj.contact_points[3] u obj.contact_points[1]) -- utilice 'o' en caso de que pieza no está completamente en el mosaico local hitx = (hit1.x+hit3.x)/2 local hitz = (hit1.z+hit3.z)/2 -- por lo general, puede dividir el mosaico en cuartos usando la x y coordenadas z si hitz < 0 entonces si hitx > 0 entonces algún dato = 1 más algún dato = 2 end más si hitx > 0 entonces algún dato = 3 más algún dato = 4 end end -- pasar algún dato al script Global return Global:call('desiredAction ', {guid, algunos datos}) final final
Este último paso puede ser complicado, porque no siempre es intuitivo cómo se determinan las coordenadas x, y, z en TTS. Por ejemplo, puede depender de cómo se gira o se voltea el mosaico. Puede que tenga que experimentar un poco. Puede agregar la línea log(hitx..” “..hitz) a la función para enviar los valores a la consola mientras experimenta.
Variation
El propósito del enfoque descrito aquí es desencadenar una acción de juego cuando un jugador coloca una pieza relevante en la ficha. Es por eso que este enfoque usa la función onCollisionEnter().
Si, en cambio, desea que la función se active solo cuando se llama en el script, puede usar un enfoque ligeramente diferente. Por ejemplo, es posible que desee que el script marque una opción que haya elegido un jugador. La guía vinculada a continuación describe ese enfoque.
Solucionar problemas
La función onCollisionEnter() puede activarse varias veces si una pieza choca contra la baldosa. Una solución para esto es evitar activar la función si no ha pasado suficiente tiempo desde la última vez que se contactó con el mosaico. Para hacer esto, incluya este código al comienzo de la función.
si Time.time - (segundos o 0) < 1 luego devuelva else segundos = Time.time end
Tenga en cuenta que la variable de segundos tiene que ser una variable global. Si no es así, puede restablecerse cada vez que se llama a la función. Tenga cuidado con los conflictos con otras variables globales.
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.