Buenas! Pues tengo dos ángulos, uno es la dirección en que mira el personaje, otra es la dirección del personaje respecto al enemigo. Cuando el enemigo hace una técnica, te ciega si lo estás mirando. Es decir, si la diferencia entre el ángulo de tu visión (point_direction(x, y, mouse_x, mouse_y)) y el angulo de la vision si le miraras point_direction(x, y, enemigo.x, enemigo.y) es < 30, por ejemplo. El problema es cuando, por ejemplo, uno vale 350 y el otro 10, ahí el valor absoluto de la resta como que no sirve...
sé que es algo bastante simple, incluso creo haberlo hecho antes, pero llevo todo el día peleando por errores estúpidos y sencillamente no lo veo, estoy muy espeso. Una ayudita molaría, espero que se entienda lo que quiero hacer. Ya he estado incluso googleando cosas como "calcular arco dados dos ángulos" y mas cosas pero no encuentro nada...
has tomado el angulo absoluto menor entre los dos angulos, entonces esta condicion te sirve :):
if (min(abs(ang1-ang2),360-abs(ang1-ang2)) < 30)
{... hacer ...}
ang1 y ang2 son los angulos involucrados.
debes tener los dos angulos siempre entre 0 y 360 grados, o si no, no te sirve :P
En serio, cuando mezclo image_xscale = -1 y ángulos... all works but i don't know why, y luego salen errores como éstos por todos lados, es un jaleo...
muchas gracias! Funciona a la perfección :D lo reusaré en otra parte donde hice la chapuza de meter un sprite como linea y ver si colisionaba xD
También puedes usar la función de "producto escalar" que básicamente dice que el arcocoseno de la multiplicación de dos vectores normalizados es igual al angulo entre ellos (arcos( |A|*|B| )=α).
Gm8.1 y studio tienen la función implementada, pero si quieres hacerla en gm8 te puedes hacer un script como este:
[gml]
var temp;
temp=point_distance(0, 0, argument0, argument1)*point_distance(0, 0, argument2, argument3);
return( ( (argument0*argument2)/temp )+( (argument1*argument3)/temp ) );
[/gml]
Entonces:
[gml]
if ( radtodeg( arccos( dot_product(enemigo.x-x, enemigo.y-y, mouse_x-x, mouse_y-y) ) )<30 ){
//Aquí tus códigos
}
[/gml]
En general la función es útil cuando manejas vectores en lugar en lugar de direcciones en grados, en muchos ya incluso tienes tus vectores normalizados por lo que ahorras todas las divisiones y calculos de distancia o simplemente no necesitas obtener el arcoseno. En todo caso te lo dejo como una opción, para esté proposito es probable que la solución de fab62 sea algo más eficiente, pero el producto escalar es practicamente indispensable en muchas situaciones.
Sep, la otra solucion es suficiente, yo no uso vectores, pero es la primera vez que veo esta formula en GM (la de veces que la hice en clase), es curioso :D