[Tutorial] Apuntar con el Mouse |
![]() ![]() « Consul » 1480639200000
| 0 | ||
Usar el Mouse para apuntar. Bienvenido a este pequeño tutorial, antes que todo, quiero aclarar que me estoy basando en el post de Makinit, donde se compartió un script para disparar flechas usando el mouse. Mi intención es tratar de explicar lo mas sencillamente, como funciona el algoritmo allí utilizado, para todo aquel que este desarrollando algo de ese estilo. Lo que haremos sera un script, que nos permita saber la posición actual de nuestro ratón mediante tfm.get, lo cual no es 100% óptimo, ya que presenta una pequeña diferencia de la posición real en la que estamos. Si deseas obtener información de como crear un método más efectivo revisa el siguiente post [Guía] tfm.get - Problemas y soluciones creado por Hinakagiyama El código completo es muy sencillo y práctico, pero lo iremos revisando función por función. (Nota: Pastebin enlace.) Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 local nombre = "Saintgio" I Code Lua 1 2 3 4 5 6 7 function main() II Code Lua 1 2 3 tfm.exec.position=function(n) En la función tfm.exec.position() aceptamos como parámetro n cualquier nombre válido de un ratón que este presente en la sala, y nos devuelve su posición aproximada en las coordenadas "x" e "y" del plano. III Code Lua 1 2 3 4 5 6 7 8 function eventMouse(n, x_final, y_final) Por último nos queda eventMouse(), el cual es un evento que se activa cada vez que hacemos click en un lugar de la pantalla (Más informacion en Documentación de Lua), y que contiene los parámetros n con el nombre del ratón que hace click, x_final e y_final que corresponde a la posición en donde hicimos el click, por ejemplo si yo hago click en la esquina superior izquierda, los valores serian: Saintgio,0,0. Ahora obtenemos la posición inicial local x_inicial, y_inicial = tfm.exec.position(nombre) que corresponde a la posición del ratón que hace click con el mouse. Con nuestras coordenadas iniciales y finales almacenadas, se ocupara la librería math para poder conocer cual es el ángulo entre las posiciones inicial y final para así poder apuntar, en específico math.atan2. Ya que math.atan2 necesita la distancia en x e y, las calculamos restando el valor final al inicial local diferencia_x = x_final - x_inicial, local diferencia_y = y_final - y_inicial. Con local angulo = math.atan2(diferencia_y, diferencia_x) obtenemos el ángulo existente entre las dos posiciones, pero con un pequeño detalle, esta en radianes. Para solucionar este problema usamos la siguiente formula: angulo = angulo*180/math.pi donde convertimos de radianes a grados. (Nota: math.pi nos entrega el valor aproximado de π.) Finalmente mostramos una flecha con tfm.exec.addShamanObject(0, x_inicial, y_inicial-45, angulo-90) sobre nuestra cabeza (por eso al y_inicial se le resta 45), para saber visualmente donde estamos apuntando según el juego y debido a que la flecha es un objeto que presenta un desfase de 90 grados respecto a los demás se le debe restar al ángulo esos 90 grados (tfm.exec.addShamanObject(0, x_inicial, y_inicial-45, angulo-90). Observación: Para cualquier otro objeto simplemente se pone el ángulo. Ejemplo: tfm.exec.addShamanObject(57, x_inicial, y_inicial-45, angulo). Dernière modification le 1481321040000 |
0 | ||
Hola. Esto está muy bien explicado pero hay un detalle con las matemáticas. atan2(y, x) devuelve el arco tangente de y/x, entonces estás usando la función al revés Al usar math.atan2(diferencia_y, diferencia_x), devuelve el ángulo correcto y no hace falta cambiarle el signo. Sin embargo la flecha saldrá girada por el hecho de que ese objeto de flecha en el ángulo 0 apunta hacia abajo, simplemente hay que trasladarlo -90 grados (porque en TFM los ángulos aumentan en sentido contrario). Eso se tendría que hacer al poner el objeto (y solo para esta flecha): tfm.exec.addShamanObject(0, x_inicial, y_inicial-45, angulo-90) El script de maki no hace esto último porque las flechas de san valentín apuntan a la derecha en ángulo 0 como debe ser. |
![]() ![]() « Consul » 1480916700000
| 0 | ||
Muchas gracias por tus apuntes, haré los cambios lo mas pronto posible para que nadie quede con el mal concepto. |
![]() ![]() « Citoyen » 1553810400000
| 0 | ||
Lo que quiero hacer es que haya mas de 1 persona en la tabla, usando un for y table.insert, pero me aparece esto: • [21:58] # [*Team Basketball ESP] Runtime Error : org.luaj.vm2.LuaError: Tiburoncin23#9884.lua:34: attempt to index ? (a nil value) tfm.exec.position=function(n) return tfm.get.room.playerList[n].x,tfm.get.room.playerList[n].y end Ahí da error, ¿a qué se debe? Dernière modification le 1553810880000 |
![]() ![]() « Citoyen » 1593798000000
| 0 | ||
Tiburoncin23 a dit : La variable 'nombre' no es una tabla, entonces debes hacer algo como: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 nombres = {} -- Creamos la tabla nombres o algo así entendi, eso debes hacer para saber quién está en la sala (más personas en la tabla) Aunque hay cosas como system.bindMouse las cuales tienes que arreglar ya que cambiamos la variable. Antes: nombre = "" Después: nombres = {} Para esto, debes usar for Code Lua 1 2 3 4 -- En vez de system.bindMouse(nombre) Espero te haya servido, todo fue explicado con comentarios, no es necesario borrarlos |