×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • Guías y Tutoriales
  • /
  • [Tutorial] Apuntar con el Mouse
[Tutorial] Apuntar con el Mouse
Saintgio
« Consul »
1480639200000
    • Saintgio#0000
    • Profil
    • Derniers messages
    • Tribu
#1
  0

http://atelier801.com/img/pays/es.png



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"


tfm.exec.position=function(n)
return tfm.get.room.playerList[n].x,tfm.get.room.playerList[n].y
end


function eventMouse(n, x_final, y_final)
local x_inicial, y_inicial = tfm.exec.position(nombre)
local diferencia_x = x_final - x_inicial
local diferencia_y = y_final - y_inicial
local angulo = math.atan2(diferencia_y, diferencia_x)
angulo = angulo*180/math.pi
tfm.exec.addShamanObject(0, x_inicial, y_inicial-45, angulo-90)
end


function main()
tfm.exec.disableAutoNewGame(true)
tfm.exec.disableAutoShaman(true)
tfm.exec.disableAutoTimeLeft(true)
tfm.exec.disableAfkDeath(true)
system.bindMouse(nombre, true)
end

main()



I




Code Lua

1
2
3
4
5
6
7
function main()
tfm.exec.disableAutoNewGame(true)
tfm.exec.disableAutoShaman(true)
tfm.exec.disableAutoTimeLeft(true)
tfm.exec.disableAfkDeath(true)
system.bindMouse(nombre, true)
end
En la función principal main(), realizamos todos los ajustes y personalizaciones que queremos que estén presentes desde el inicio de la ejecución del script, destaca la última linea system.bindMouse(nombre, true), en la cual configuramos que el juego responda cuando un jugador hace click en la pantalla, en este caso el jugador que esta definido en la primera linea de todo el código. (Más informacion en Documentación de Lua).


II



Code Lua

1
2
3
tfm.exec.position=function(n)
return tfm.get.room.playerList[n].x,tfm.get.room.playerList[n].y
end

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)
local x_inicial, y_inicial = tfm.exec.position(nombre)
local diferencia_x = x_final - x_inicial
local diferencia_y = y_final - y_inicial
local angulo = math.atan2(diferencia_y, diferencia_x)
angulo = angulo*180/math.pi
tfm.exec.addShamanObject(0, x_inicial, y_inicial-45, angulo-90)
end

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.

http://image.prntscr.com/image/8a7c3f98d51b468a938b04a19717a53c.png



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 π.)

http://yoaceptado.weebly.com/uploads/5/5/8/8/55885393/5734703_orig.jpg



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
Haku
« Sénateur »
1480915440000
    • Haku#0807
    • Profil
    • Derniers messages
#2
  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.
Saintgio
« Consul »
1480916700000
    • Saintgio#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
Muchas gracias por tus apuntes, haré los cambios lo mas pronto posible para que nadie quede con el mal concepto.
Tiburoncin23
« Citoyen »
1553810400000
    • Tiburoncin23#9884
    • Profil
    • Derniers messages
#4
  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
Admiire_me
« Citoyen »
1593798000000
    • Admiire_me#6770
    • Profil
    • Derniers messages
#5
  0
Tiburoncin23 a dit :
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?

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
function eventNewPlayer(n) -- Cada vez que entre un jugador
table.insert(nombres, n) -- Insertamos al jugador en la tabla
end -- Ceramos 'function'
function table.delete(tab,value) -- Función de Bolodefchoco para remover de una tabla
for i,v in pairs(tab) do -- Para la tabla especificada
if v==value then -- Si se encuentra, entonces
table.remove(table,i) -- Eliminamos de la tabla la posición del valor
end -- Cerramos 'if'
end -- Cerramos 'for'
end -- Cerramos 'function'

function eventPlayerLeft(n) -- Cuando un jugador se vaya
table.delete(nombres, n) -- Lo quitamos de la tabla con la función de Bolodefchoco
end -- Cerramos 'function'

for n,p in pairs(tfm.get.room.playerList) do -- Para todos los jugadores
eventNewPlayer(n) -- Llamamos a la función eventNewPlayer
end -- Cerramos 'for'

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)
for n,p in pairs(nombres) do -- Para la tabla nombres
system.bindMouse(n, true) -- Ejecutamos bindMouse
end -- Cerramos 'for'

Espero te haya servido, todo fue explicado con comentarios, no es necesario borrarlos
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • Guías y Tutoriales
  • /
  • [Tutorial] Apuntar con el Mouse
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27