Sugerencia para la función get_dist()

Started by Erkosone, February 05, 2013, 06:17:58 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Erkosone

Nota: Cuelgo este mensaje en esta sección en inglés por que no me aparece la de español  no se por que motivo.. pero no la veo accesible  :o




Bueno, la sugerencia es bastante básica pero creo que es algo que hemos echado de menos muchos en alguna ocasión, se trata de la famosa función get_dist(), la cual mide la distancia entre los centros de 2 sprites.


La sugerencia es crear una versión de esta función un poco mas "comoda" para los vídeo juegos, basicamente se trata de crear una función que devuelva la distancia entre 2 sprites pero NO desde los centros, si no desde sus perímetros, osea.. si tengo una nave y una roca en pantalla.. y están separadas por un unico pixel de distancia para que colisionen entre si, pues get_dist me devuelve ahora mismo la distancia entre centros, pero la sugerencia es crear una función que devuelva la separación entre los contornos.


He leído por algún sitio que se suele hacer algo así:
1- Se mira el angulo que forman los centros de los sprites.
2 - Se comienza a avanzar desde el centro de uno de los dos con el angulo que forman ambos con la intención de ir aproximandose al segundo sprite.
3 - Cuando se ha avanzado lo suficiente como para no colisionar con el primer sprite se anota ese punto X/Y.
4 - Se continúa avanzando hacia el segundo sprite.
5 - Cuando se entra en colisión con este segundo sprite se anota la posición X/Y.
6 - Se calcula la distancia euclidiana entre el punto A y el punto B.




Esto sería de grandiosa ayuda para nuestros juegos, pues permite usarlo para muchisimas cosas.
Haber que os parece la idea..


Yo llamaría a esta función: Get_dist2D() o algo así.

SplinterGU

#1
eso de "avanzar" asusta... hacer un bucle para avanzar y detectar es algo que no podemos permitir en un collision que podria estar haciendo calculos con cientos de procesos...

usa las funciones de colision que no tienen en cuenta pixels...

collision_box
collision_circle

:)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

#2

Este problema ya me lo he encontrado algunas veces yo mismo.
Creo que escribiré esa función en BennuGD, pero a nivel de caja (no a nivel de pixel) y sin tener en cuenta los puntos de control:

Function get_dist2D(id_objetivo);
Private
   ancho_padre;
   alto_padre;
   ancho_objetivo;
   alto_objetivo;
   dist_x;
   dist_y;
   dist_xy;
Begin
   if(!exists(id_objetivo)) return -1; end
   
   //recogemos los anchos de los dos procesos
   ancho_padre=graphic_info(father.file,father.graph,G_WIDTH);
   alto_padre=graphic_info(father.file,father.graph,G_HEIGHT);
   ancho_objetivo=graphic_info(id_objetivo.file,id_objetivo.graph,G_WIDTH);
   alto_objetivo=graphic_info(id_objetivo.file,id_objetivo.graph,G_HEIGHT);


   //distancia en X
   if(father.x<id_objetivo.x)
      dist_x=(id_objetivo.x-(ancho_objetivo/2))-(father.x+(ancho_padre/2));
   elseif(father.x>id_objetivo.x)
      dist_x=(father.x-(ancho_padre/2))-(id_objetivo.x+(ancho_objetivo/2));
   else
      dist_x=0;
   end
   
   //distancia en Y
   if(father.y<id_objetivo.y)
      dist_y=(id_objetivo.y-(alto_objetivo/2))-(father.y+(alto_padre/2));
   elseif(father.y>id_objetivo.y)
      dist_y=(father.y-(alto_padre/2))-(id_objetivo.y+(alto_objetivo/2));
   else
      dist_y=0;
   end


   //la distancia puede ser negativa si los procesos están lo bastante juntos
   if(dist_x<0) dist_x=0; end
   if(dist_y<0) dist_x=0; end
   
   dist_xy=dist_x+dist_y;
   
   return dist_xy;
End



Pd: Te he movido el post a Español. No entiendo el problema :\

FreeYourMind

por cierto pixel me ha molado tu juego de lucha para android xD como se llaman los musicos ?

panreyes

Quote from: FreeYourMind on February 05, 2013, 10:05:00 AM
por cierto pixel me ha molado tu juego de lucha para android xD como se llaman los musicos ?
Tom Bombadil: http://www.myspace.com/tombombadilcs


Viva el ultraofftopic xDD

SplinterGU

Quote from: PiXeL on February 05, 2013, 09:26:02 AM

Este problema ya me lo he encontrado algunas veces yo mismo.
Creo que escribiré esa función en BennuGD, pero a nivel de caja (no a nivel de pixel) y sin tener en cuenta los puntos de control:

Function get_dist2D(id_objetivo);
Private
   ancho_padre;
   alto_padre;
   ancho_objetivo;
   alto_objetivo;
   dist_x;
   dist_y;
   dist_xy;
Begin
   if(!exists(id_objetivo)) return -1; end
   
   //recogemos los anchos de los dos procesos
   ancho_padre=graphic_info(father.file,father.graph,G_WIDTH);
   alto_padre=graphic_info(father.file,father.graph,G_HEIGHT);
   ancho_objetivo=graphic_info(id_objetivo.file,id_objetivo.graph,G_WIDTH);
   alto_objetivo=graphic_info(id_objetivo.file,id_objetivo.graph,G_HEIGHT);


   //distancia en X
   if(father.x<id_objetivo.x)
      dist_x=(id_objetivo.x-(ancho_objetivo/2))-(father.x+(ancho_padre/2));
   elseif(father.x>id_objetivo.x)
      dist_x=(father.x-(ancho_padre/2))-(id_objetivo.x+(ancho_objetivo/2));
   else
      dist_x=0;
   end
   
   //distancia en Y
   if(father.y<id_objetivo.y)
      dist_y=(id_objetivo.y-(alto_objetivo/2))-(father.y+(alto_padre/2));
   elseif(father.y>id_objetivo.y)
      dist_y=(father.y-(alto_padre/2))-(id_objetivo.y+(alto_objetivo/2));
   else
      dist_y=0;
   end


   //la distancia puede ser negativa si los procesos están lo bastante juntos
   if(dist_x<0) dist_x=0; end
   if(dist_y<0) dist_x=0; end
   
   dist_xy=dist_x+dist_y;
   
   return dist_xy;
End



Pd: Te he movido el post a Español. No entiendo el problema :\

claro, puntos de control, centro, size, angulo, mirrors son la complejidad de la funcion... sin esto, la funcion seria muy simple.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

Algo es algo, oye xD


Ahí está la función simple. El que la quiera mejorar/complicar, bien puede.

SplinterGU

pero me gustaria que se entiende que yo no puedo integrar a un motor que tiene angulo, size, mirrors, centros, funciones que no consideren estos parametros... porque sino el motor seria erratico... si cada uno puede implementar, basados en las reglas de su juego, estas funciones simples, sin considerar todos estos aspectos como lo hizo pixel.

se entiende eso o no se entiende?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Si que se entiende.
Bueno, no quería dejar la sugerencia guardada en una caja, la suelto y si se puede genial, si no pues nada.


Algo como lo que dice Pixel ya hice alguna vez.

Arcontus

La sugerencia de Erkosone me parece muy útil. De hecho yo me programé algo parecido para resolver un problema que tenía, y lo que hice fue lo único que se me ocurrió. Lo que hice fue lo siguiente:

Proceso A //Es el proceso al cual queremos ver el punto más cercano a otro proceso.
Proceso B[8] //Grupo de procesos hijos de A, para revisar el punto mas cercano. Es un solo pixel de grosor.

1 Pintamos proceso A
2 Lanzamos desde el centro de A 8 procesos B, cada uno orientado a 45º más que el anterior.
3 Avanzamos pixel a pixel en la dirección anteriormente seleccionada.
4 Anotamos en el instante donde B ya no colisiona con el proceso A.
5 Verificamos las distancias de los 8 procesos con la distancia del proceso X y anotamos el resultado más bajo.

Y con esto, se tiene en cuenta los tamaños (size), espejos (mirror), o giros (angle) del proceso A.

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com