Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: DarkKRuleR en Junio 25, 2013, 04:13:14 PM

Título: Problemas con los ángulos
Publicado por: DarkKRuleR en Junio 25, 2013, 04:13:14 PM
Buenas a todos! Pues tantos años de comenzar proyectos (para mí) increíbles, y de dejar la mayoría por costar hacer las animaciones gráficas (todos abandonados) me decidí a intentar un "minijuego". No lo es, pues será MUY complejo, pero será estilo gráficos muy simples (la historia lo justifica).

Pongamos al personaje y objetos pequeños por el escenario. Quiero "afectar" sólo a los objetos situados en un cono delante del personaje a donde él mira según el ratón. Tengo esto:

if (point_direction(objM.x, objM.y, x, y) <= ang(45+point_direction(objM.x, objM.y, mouse_x, mouse_y))
        or point_direction(objM.x, objM.y, x, y) >= ang(315+point_direction(objM.x, objM.y, mouse_x, mouse_y)))


ang es una función que ajusta ángulos (si se pone <0 o >359 suma o resta 360 para ajustar). Pero no funciona!

En el caso más simple, mirando a la derecha con el ratón, la suma del lado derecho de la ecuación que tiene el point direction da 0, pues el personaje está a la izquierda y el objeto a la derecha, y dará cero. Así, en el primer caso, si el ángulo entre el personaje y el objeto (x, y son las coordenadas del objeto, objM.x del personaje) es menor o igual que 45 o mayor o igual que 315, ok.

ESO DEBERÍA afectar a todos los objetos situados en un cono de 90 grados si miro a la derecha. Y, sumando el point direction según el ángulo entre objM (personaje) y el ratón, debería funcionar para tdos los lados...

qué hago mal? Espero que se entienda. El personaje mira hacia donde está el ratón, y quiero que "Lance rayos" que tienen una cobertura de 90º, "afectando" a todo objeto dentro del cono, comparando los ángulos, pero no me funciona.

PD: preferiría no usar un objeto con un sprite con forma de cono, pues la distancia del cono variará, y también su anchura en grados variará, prefiero hacerlo matemáticamente comparando ángulos.
Título: Re:Problemas con los ángulos
Publicado por: romon_28 en Junio 25, 2013, 05:04:33 PM
Fijate: http://www.comunidadgm.org/index.php?topic=17971.0 (http://www.comunidadgm.org/index.php?topic=17971.0)
Título: Re:Problemas con los ángulos
Publicado por: DarkKRuleR en Junio 25, 2013, 05:17:23 PM
grax, pero el problema no era ese sino localizar al objeto dentro del cono.

News: CREO que POR FIN LO LOGRÉ! He estao provando y parece funcionar pero no lo tengo claro. Me ha costao por dios. Es una solución seguramente ineficiente, bueno, si la queréis ver y decirme pero yo veo que no es eficiente,aunque es mejor que nada... ninguna otra cosa me funcionó.

//LLAMAR DESDE EL OBJETO OBJETIVO A ESTAR DENTRO DEL CONO.
//ObjM es el personaje que mira al ratón (dirección del cono).
//argument0 = amplitud del cono
//argument1 = distancia max del cono
var mira; mira = round(point_direction(objM.x, objM.y, mouse_x, mouse_y));
//mira = dirección a donde miramos
var busca; busca = round(point_direction(objM.x, objM.y, x, y));
//busca = dirección en la que se encuentra el objeto a buscar
//mira y busca deben separarse no más de la amplitud deseada, ese número será "valor"
var a, b;
for (a = 0; a < 360; a += 1) {
    if (a == mira) break;
}
for (b = 0; b < 360; b += 1) {
    if (b == busca) break;
}
if (a > b) valor = a-b; else valor = b-a;

if (distance_to_object(objM) <= argument1 and valor <= argument0/2) return true;
else return false;


la función se llama DESDE EL OBJETIVO, por ejemplo una caja que queremos ver si está dentro del cono, y objM es el personaje. Por ejemplo, si queremos "que toda mariposa dentro del cono del personaje vaya volando", EN EL OBJETO MARIPOSA, llamamos a la funcion.
la funcion no sirve para llamarla desde el personaje y ver si detecta a un enemigo en el cono, sino para llamarla desde el objeto y ver si el personaje lo está mirando (ya haré otra version apra la primera, pero necesitaba una versión así en este caso)
Título: Re:Problemas con los ángulos
Publicado por: brunoxzx en Junio 25, 2013, 08:26:45 PM
Usas gm8.1?, ya tiene una función creada para esto.

Esto se hace con el producto escalar o dot_product, que básicamente dice que la multiplicación de dos vectores normalizados nos da el coseno del angulo comprendido entre ambos vectores. Puedes buscar en otras fuentes de información o preguntar en el mismo tema, solo no tengo ganas de explicar algo si no le van a poner atención.


[gml]
var x1, y1, d, x2, y2, d2, dot;
d=point_distance(objM.x, objM.y, mouse_x, mouse_y);
x1=(objM.x-mouse_x)/d;
y1=(objM.y-mouse_y)/d;

with(obj_mariposa){
      d2=point_distance(objM.x, objM.y, mouse_x, mouse_y);
      x2=(objM.x-x)/d2;
      y2=(objM-y-y)/d2;
      dot=radtodeg( arccos(x1*x2+y1*y2) );
      //Y listo dot es igual al angulo que querías
      if ( dot<90 ){
          //Wololo
      }
}
[/gml]

EL código debe de ir en cualquier objeto que no sea la mariposa..
Título: Re:Problemas con los ángulos
Publicado por: Zela en Junio 26, 2013, 06:39:22 PM
Hola, Realice un ejemplo, (Lo Cree Según Entendí Su Problema)

Espero Le Sirva

PD: El Ejemplo Es En  :GM8:, No Esta Muy Bien Redactado Junto Con Que No Esta Optimizado
Saludos
Título: Re:Problemas con los ángulos
Publicado por: brunoxzx en Junio 27, 2013, 05:19:39 AM
Te dejo uno como el de zela ya con distancia maxima, también lo puedes adaptar para que quede en un script. Al final puedes usar el que quieras, creo que el de zela puede ser algo más fácil de entender y poquitín más lento. En fín en gm da casi lo mismo.
[gml]
var x1, y1, d, x2, y2, d2, dot;
d=point_distance(objM.x, objM.y, mouse_x, mouse_y);
x1=(objM.x-mouse_x)/d;
y1=(objM.y-mouse_y)/d;

with(obj_mariposa){
      d2=point_distance(objM.x, objM.y, mouse_x, mouse_y);
      if (d2>distancia) continue;
      x2=(objM.x-x)/d2;
      y2=(objM-y-y)/d2;
      dot=radtodeg( arccos(x1*x2+y1*y2) );
      //Y listo dot es igual al angulo que querías
      if ( dot<90 ){
          //Wololo
      }
}[/gml]