[GC y En general] Deteccion de Colision

Hola [chiu]
Como ya tengo vacaciones [360º], por fin me he podido poner en serio con mi proyecto de juego arcade de accion para GC, que porque para esa consola en concreto?? pues uno que es un enamorau de nintendo [tomaaa], pero al grano...

Primero explicare como lo hago en mi programa... la forma en que hago que el personaje detecte que ha pisado el suelo:
int HitDet(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2){ [color=#00bb00]// Deteccion de colision.[/color]
   if(x1+w1>x2&&x1<x2+w2&&y1+h1>y2&&y1<y2+h2)
      return 1;
   return 0;
}
Y despues en el bucle principal del programa he metido:
m=0;
   do
   {
      if(HitDet(player[0].x,[color=#FF0000][b]player[0].y+84[/b][/color],[color=#ff00ff][b]21[/b][/color],[color=#0000FF][b]1[/b][/color],base[m].x,base[m].y,[color=#00FFFF][b](base[n].width/2)-9[/b][/color],[color=#00FF00][b]1[/b][/color]))
      [color=#00bb00]// Sprite prota: ancho pies (zona real apoyo) 24px y margen izq vacio (extender brazos, armas largas...) 18px
                // Como la resolucion trabaja con x*2 en vez de x directamente...(24+18)/2=[color=#ff00ff][b]21[/b][/color]
      // [color=#FF0000][b]player[0].y+84[/b][/color] para comenzar desde justo la parte superior del pie del prota
      // [color=#0000FF][b]1[/b][/color] es para coger para el calculo solamente la "suela"
                // [color=#00FFFF][b](base[n].width/2)-9[/b][/color] /2 es por la resolucion (x*2) y -9 (9*2=18px) para despreciar el margen ya comentado
      // [color=#00FF00][b]1[/b][/color] sirve para que solo pueda haber colision con el borde superior de las plataformas[/color]
      {
         n=m; [color=#00bb00]// para otro calculo aparte...[/color]
         fall=0;
      }
      m++; [color=#00bb00]// Compruebo todas las plataformas creadas, que de momento son 3[/color]
   }
   while (m<3);
Y viene la pregunta.......tatatachannnnn!!!!
Como puedo hacer para tambien detectar la colision con superficies inclinadas (una cuesta por ejemplo)???

Gracias, ciao [oki]
hola, que tal si para hacer la colision con superficies inclinadas haces la colision con una recta que une los dos puntos que la forman?
Ya lo habia pensado pero...como doy las coordenadas para generar una recta inclinada? es que no lo termino de ver xD

ACLARACION: es que el problema es que para mi calculo uso ancho y alto y una unica coordenada mientras que para un plano inclinado en vez de la anchura necesitaria una segunda coordenada....me sigues?
esque en estas cosas todo depende de las estructuras de datos que tengas, la colision quieres que sea de una linea inclinada a un plano? esa sería fácil
si me podrias explicar la diferencia en si entre las dos opciones que comentas?
Hmmm, la verdad esque este tema solo lo he tocado en Game Maker, pero lo suyo sería detectar "colores de pixeles". Me explico. Si por ejemplo quieres ir a la izquierda, compruebas primero que hay espacio sin inclinación (hay pixeles "no transparentes" por el camino), si no es así, compruebas cuantos pixeles "no transparentes" hay, si el numero no supera un numero de pixeles determinado por tí, entonces subes el muñeco ese numero.
En game maker era facil porque las colisiones ya estaban programadas, pero no se si podrá funcionar en GC, espero que te haya servido al menos como una ligera idea :P
por lo que he entendido quieres hacer colisiones por cajas ok? bueno para colisiones por cajas en sistemas inclinados puedes intentar ver si la recta colisiona con la caja, para esto puedes buscar las ecuaciones matemáticas.
No se si te servirá ya, pero he encontrado esto:

http://jnrdev.72dpiarmy.com/en/jnrdev2/

Ahi hay tambien info sobre colision por tiles y eso miralo a ver que te parece ;)
Un modo más o menos fácil, es tener una matriz referenciada al objeto de booleanos, donde indiquen si hay materia o no, y basicamente en función de la posición superior izquierda (la tratas como un cuadrado) miras si colisionan partes materiales.

Otro modo es controlar el color del pixel, lo habitual es usar un color raro, que te digo yo un verde pistacho, este haces que no se represente en pantalla pero lo consideras en la colisión.

No se si me explico.
supreme escribió:Un modo más o menos fácil, es tener una matriz referenciada al objeto de booleanos, donde indiquen si hay materia o no, y basicamente en función de la posición superior izquierda (la tratas como un cuadrado) miras si colisionan partes materiales.

Otro modo es controlar el color del pixel, lo habitual es usar un color raro, que te digo yo un verde pistacho, este haces que no se represente en pantalla pero lo consideras en la colisión.

No se si me explico.


Cuidado con lo de detección de colores, que mi primer proyecto en LUA lo usaba, porte el sistema a C + SDL y fue una pérdida de velocidad brutalísima... cómo no cuentes con alguna función para detectar colores superoptimizada (y que recuerdos que me viene del DIV2 ahora mismo xD) olvida eso

Yo lo tengo por tiles: si la Y del personaje + su altura entran dentro de un tile duro, se le resta a la Y un valor para que salga de él y se mantenga encima (aunque ahora que lo pienso se me ocurre cómo optimizar lo que tenía :-p )

Mucha suerte man, a ver si cuando me rule el Viper me meto yo también un poco con la Gamecube
Lupi escribió:No se si te servirá ya, pero he encontrado esto:

http://jnrdev.72dpiarmy.com/en/jnrdev2/

Ahi hay tambien info sobre colision por tiles y eso miralo a ver que te parece ;)
Por fin he sacado tiempo para seguir programando, ya que he andado un poco liado y ponerme a mirar codigo por mucho que me gustase no era una de las cosas que mas me atraian :-P

Me he leido casi entero el "manual" que me enlazaste y....como decirlo....lo entiendo completamente, pero me parece un trabajo de chinos ya que para que el movimiento por una rampa quedase realista tendria que poner bastantes "escalones" y como la cuestita sea larga, apaga y vamonos [mad]

zestt escribió:Yo lo tengo por tiles: si la Y del personaje + su altura entran dentro de un tile duro, se le resta a la Y un valor para que salga de él y se mantenga encima (aunque ahora que lo pienso se me ocurre cómo optimizar lo que tenía :-p )
Supongo que te refieres a justito exactamente el mismo proceso que se detalla en el manual con lo que poco practico me parece [agggtt] pero...si podrias contar desde tu experiencia que tal va?

Gracias a todos [oki]
No sé si te servirá de mucho o siquiera si te refieres a este tipo de colisiones, pero has considerado hacer las colisiones esféricas? Es decir, en lugar de hacer una 'envoltura' rectangular para el personaje, hacerla esférica, calculando si el/los objetos están dentro de un radio (o incluso elíptica, con un par de radios, en lugar de uno solo).

Para hacerlo, simplemente trasladarías el punto a ser el centro, en lugar de una esquina, y con las típicas fórmulas de geometría de la ESO (de las que ya ni me acuerdo XD), comprobar si está dentro o no del objeto...

No sé si es esto lo que quieres, pero por si acaso te puede ser útil, lo dejo ahí por si no lo habías considerado...
11 respuestas