[PALIB] Opinion sobre codigo para colisiones

Estoy trasteando con las colisiones ahora que se sacar por pantalla imagenes. Queria saber como veis este codigo para hacer que cuando colisione no atraviese el objeto. El único problema que tiene al ejecutarlo es que al chocar hace como un pequeño zumbido porque al chocar lo que hago es desplazar en sentido contrario a la tecla pulsada por eso almaceno la posicion en 4 variables, la x e y para la posicion y a y b para saber hacia donde repeler cuando hace el choque sino se quedaria pegado. Se trata del ejemplo de dos circulos de 32 de diametro en el que un circulo xoca con otro estatico pero con cosas nuevas.

Alguien me puede decir una pagina donde se explique una colision de este tipo pero bien hecha sin el zumbido? O como mejorar el que he hecho.

Edito:Acabo de solucionar el problema del zumbido, el problema era el segundo setsprite() que tenia, simplemente eliminandolo esta resuelto el problema, aunque me interesan las opiniones y saber si me he complicado demasiado, que puede ser.



#include <PA9.h>     
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

int main()
{
   PA_Init();   
   PA_InitVBL();
   
   PA_LoadSpritePal(0,0,(void*)esferaazul_Pal);
   PA_CreateSprite(0,0,(void*)esferaazul_Sprite,OBJ_SIZE_32X32,1,0,10,10);
   PA_CreateSprite(0,1,(void*)esferaazul_Sprite,OBJ_SIZE_32X32,1,0,70,60);
   
   u32 x=0,y=0,a=0,b=0;
   bool NoHayColision=true;
   
   while (1)
   {                             
      if(NoHayColision)
      {
         a=0,b=0;
         a = Pad.Held.Right - Pad.Held.Left;
         x+=a;
        b = Pad.Held.Down - Pad.Held.Up;
         y+=b;
         PA_SetSpriteXY(0,0,x,y);         
      }
      else
      {   
         x+=-a;
         y+=-b;
       // PA_SetSpriteXY(0,0,x,y);         
      }
      
      if(PA_Distance(x,y,70,60)< 32*32) NoHayColision=false;         
      else NoHayColision=true;
      
      PA_WaitForVBL();
   }
      return 0;
}
Otra forma de hacerlo seria comprobar la colision antes de mover el objeto, de esa manera no se producirian rebotes...
En cuanto a la deteccion de colisiones, hay muchas formas, elige la que menos recursos te consuma con el mejor resultado. Por ejemplo, si estas "chocando" dos circulos, no te pongas a comprobar la colision pixel a pixel, tal como la haces ahora valdria (por distancias).
A que te refieres a que se evalue por distancias, a que compruebe si colisiona no pixel a pixel sino cada 8 pixels por ejemplo? Muchas gracias.
lo mejor es usar dos mapas,uno el fondo y otro con las colisiones, en el mapa de colisiones, si el color es magenta no colisiona, si es otro color si... yo asi lo tengo en mi zelda...
ok lo tendre en cuenta plata, asi seguro k es mas facil y todo
Yo hablaba de dos objetos, en el caso de ser un mapa lo de separar ambos mapas es muy buena opcion.
Solo quieres detectar las colisiones o tambien que los objetos reaccionen a ellas? Si solo quieres hacer colisiones lo del mapa es lo mas practico, si quieres reaccionar a las colisiones es mas complejo.
La idea es detectar colision y que el objeto no atraviese el objeto. Otro dia probare con un mapa de textura de un color determinado a ver cuando tenga tiempo.
Las colisiones de objetos (sprites) entre sí se suelen hacer normalmente (si no se quiere hacer pixel a pixel que come muchos recursos) mediante geometría.

Si son dos círculos es muy sencillo, ya que con medir la distancia entre sus centros y comprobar si no es menor que la suma de sus radios vale. En el caso de cuadrados o rectángulos se mide distancias entre lados... a ver si veo algo por google que lo explique: http://www.vb-mundo.com/Deteccion-Colisiones-2D.asp

En caso de colisiones de un objeto con un escenario (paredes etc...) desde los años 80 se utiliza el famoso mapa de colisiones (por colores) y funciona realmente bien. Así que ¿por qué cambiarlo? :P

Ahora bien, si un juego es en un escenario por celdas (por ejemplo Advance Wars, que te mueves de una casilla o celda a otra, no es movimiento libre), lo mejor no es un mapa de colisiones, sino una matriz de colisiones. Se utiliza por ejemplo una matriz para saber dónde están situados los objetos y jugadores, y otra matriz para pintar el terreno. Se asigna un valor a las celdas de la matriz según lo que haya en esa posición -> 1: terreno libre; 2: pared; 3: agua; 4: arboles...
Para hacer el mapa de colisiones que utlizais la orden PA_EasyBgGetPixel()? Para saber el color.
9 respuestas