Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4191 miembros registrados.
El último usuario registrado es Victor Inkheart.

Nuestros miembros han publicado un total de 85160 mensajes en 12122 argumentos.

Detección en círculo (variables y coordenadas)

Ver el tema anterior Ver el tema siguiente Ir abajo

Detección en círculo (variables y coordenadas)

Mensaje por silvanash el 2015-02-12, 22:56

"No sé cómo hacer una visión en círculo" - Leda 2015.

Pues eso mismo, el tito silva va a escribir un tocho post acerca de cómo hacer que los enemigos puedan detectar algo (lo que sea, siempre y cuando tenga coordenadas asociadas) en un rango circular.

Vamos por partes:

Asumiré que la gente sabe cómo leer y guardar coordenadas de evento en variables. Ahora, a por las mates.

Tenemos al eventoA (asumamos que un enemigo) y luego tenemos a Alexis (asumamos que el eventoB, "B" de "butanero"). El eventoA tiene un rango de detección circular, y cazará a Alexis para robarle la bombona en cuanto se acerque a él.

El rango de detección típico y clásico es el mega-cuadrado. Viene a ser comprobar si la diferencia de coordenadas en alguna de los ejes es superior a un valor máximo. Por partes:

Variable[1] = EventoA.coordenadaX
Variable[1] restar Alexis.coordenadaX
Si Variable[1] menor o igual que [límite]
-> Robar bombona
Fin de condición

Y lo mismo con el eje Y. (Si alguien no entiende la operación, lo remito a éste tema).

El mecanismo funciona, pero trae un inconveniente obvio: el eventoA es capaz de robarle la bombona a Alexis en las esquinas del cuadrado, lo que le da una enorme ventaja ya que cubre un área mucho mayor en las esquinas que en los centros. Además, una detección en cuadrado resulta anti-natural. La visión en círculo también resulta antinatural, pero es más lógica.

Ahora bien, ¿cómo se mira en círculo usando tiles? Tal y como le dije a Leda, "que la suma de los valores absolutos de las coordenadas no sea superior al radio del círculo". La respuesta a eso fue evidente.

Esa frase se traduce tal que así:
Variable[1] = diferencia de coordenada X entre el eventoA y Alexis (igualar a la del evento y restarle la de Alexis).
Variable[2] = diferencia de coordenada Y entre los dos.

Esas dos variables tienen como posibles valores números positivos, negativos, y cero. Si alguien no entiende por qué, que se lea el tocho-tutorial de coordenadas otra vez). "Valor absoluto", en términos que entendamos, viene a ser descartar los negativos. En pseudo-código:

Si variable[1] < 0, multiplicar variable[1] por -1
Si variable[2] < 0, multiplicar variable[2] por -1

Con esto, si alguna de las variables (o las dos) tenía un valor negativo, ahora es positivo (no me hagáis explicaros cómo funciona una multiplicación entre dos números negativos).

Lo siguiente es sumarlo todo.

Variable[1] sumar Variable[2]

Lo siguiente es "que la suma no sea superior al radio del círculo". Radio en tiles, claro (y espero que sepáis distinguir entre "radio" y "diámetro"). Asumamos que el radio es de 4 tiles.

Si variable[1] <= 4
-> Robar bombona
Fin de condiciones

Alto, alto. Explicación.

Como ya es tarde, voy a resumir un poco. Todas las coordenadas que indique abajo son valores absolutos (es decir, que ya se ha hecho eso de multiplicar por -1 si eran valores negativos):

Si X vale 4 e Y vale 0, le roba la bombona, y lo mismo si invertimos los ejes (X = 0 e Y = 4). Esto es la visión en cuadrado clásica.
Si X vale 2 e Y vale 2, le roba la bombona. Esto pasa también en la visión en cuadrado, donde sólo se comprueba si alguno de los ejes sobrepasa el límite máximo.
Si X vale 3 e Y vale 2, ¡no le roba la bombona! Con la visión en cuadrado sí que podía hacerlo, pero es imposible con el círculo, porque la suma de las coordenadas da 5, y 5 es mayor que 4 (espero).

Si alguien está interesado en hacer una visión en cono, que mire éste engine.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 1621

Gracias : 227

Volver arriba Ir abajo

Re: Detección en círculo (variables y coordenadas)

Mensaje por Mukadelheid el 2015-02-13, 00:03

Algo opcional seria ;


Para hacer la "visión" en "circulo", utilizas esto como condicional :


Verifica si el jugador esta dentro del rango de "visión" del evento.

Código:
($game_player.x - $game_map.events[ID].x).abs - ($game_player.y - $game_map.events[ID].y).abs < Distancia



Verifica si el jugador esta Fuera del rango de "visión" del evento.

Código:
($game_player.x - $game_map.events[ID].x).abs + ($game_player.y - $game_map.events[ID].y).abs >= distancia



Reemplazas el ID con el del evento que "vera" y la Distancia con  la cantidad de tiles desde el centro(desde el mismo evento)

Podría ayudarle a alguien...
avatar
Mukadelheid
Principiante
Principiante

0/3

Créditos 334

Gracias : 28

Volver arriba Ir abajo

Re: Detección en círculo (variables y coordenadas)

Mensaje por mrhawi el 2015-02-13, 01:10

La solución correcta sería para distancia "circular" sería:

norm2((xp - xo, yp - yo))

o

sqrt((obj1.x - obj2.x)^2 + (obj1.y - obj2.y)^2)

Lo otro sería hacer algo como un decision boundary:

Spoiler:

Sin embargo el cálculo de la norma euclideana es en general es una foma común de calcular la distancia mínima.

Ahora lo que se explica en este post (encuentro que se complican más de lo que realmente es xD); es usar "taxicab geometry"

http://en.wikipedia.org/wiki/Taxicab_geometry

en este caso sería como lo que explicaron

|obj1.x - obj2.x| + |obj1.y - obj2.y| < d

En español, sacar la distancia de las posiciones relativas en cada eje coordenado, entre los objetos 1 y 2 y sumarlas.

just simple algebra xD

mrhawi
Aventurero
Aventurero

0/3

Créditos 2668

Gracias : 89

Volver arriba Ir abajo

Re: Detección en círculo (variables y coordenadas)

Mensaje por Ledai el 2015-02-13, 19:44

"Ya sé cómo hacer una visión en círculo" - Leda 2015 [V0.1].

Y lo logré!!! Por fin he logrado entender un poco cómo funciona la lógica de este calculo tan sencillo para vuestros grandes cerebros matemáticos.
Y he logrado sacar una "demo" simple del Tuto:
mediafire.com ?373h1vu0dkbeims
Sil, te doy mil gracias por esto, ahora intentaré pasarlo a lo que ya tengo hecho en el minijuego de pesca... ya os contaré.
Salu2!!

Edt: Por favor que alguien le de un Logro por buen samaritano a Silvanash Porque ha logrado que el radio de la caña de pescar sea REDONDO!! como debe de ser!!!!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2811

Gracias : 173

Volver arriba Ir abajo

Re: Detección en círculo (variables y coordenadas)

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.