[PROGRAMACION] Problema con colisiones entre objetos multipl

Hola, estoy desarrollando un juego(obio xDD). Bueno, la cosa que llevo ya mucho tiempo con un bug que no se de donde coño sale.

Tengo tres objetos que colisionan. El personaje, y los enemigos(zombis).

Todos los zombis que saco(mediante una funcion puedo sacar los que quiera), colisionan perfectamente con el personaje, pero el problema esta en que el personaje SOLO COLISIONA CON UN ZOMBI.

Tengo el codigo repartido en varios archivos, pongo aqui la parte que hace que colisione:

main.c (este codigo esta dentro de una funcion que inicia todo el motor del juego y el personaje):

//////////////////////////////////////////////
//Movimiento
//////////////////////////////////////////////
if(Pad.Held.Down && personaje.col1 == 0){
personaje.y +=3;
}


if (Pad.Held.Up && personaje.col2 == 0){
personaje.y -=3;
}



if (Pad.Held.Right && personaje.col3 == 0){
personaje.x+=3;
}


if (Pad.Held.Left && personaje.col4 == 0){
personaje.x-=3;
}



zombis.h (aqui esta toda la IA de los enemigos, mediante la funcion crearzombi(s32 nzom); creo un zombi y le asigno un valor que identifica a cada zombi en un array de estructuras):

if (personaje.x>zombi[nzom].x-personaje.scrollx-32 && personaje.x<zombi[nzom].x-personaje.scrollx+32 && personaje.y>zombi[nzom].y-personaje.scrolly-50 && personaje.y < zombi[nzom].y-personaje.scrolly + 50){
personaje.colision =1;

}
else{
personaje.colision = 0;

}

if (personaje.y>zombi[nzom].y-personaje.scrolly-50 && personaje.y < zombi[nzom].y-personaje.scrolly -38 && personaje.x>zombi[nzom].x-personaje.scrollx-32 && personaje.x<zombi[nzom].x-personaje.scrollx+32){
personaje.col1 = 1;
}

else {
personaje.col1 = 0;
}


if (personaje.y < zombi[nzom].y-personaje.scrolly + 50 && personaje.y>zombi[nzom].y-personaje.scrolly+38 && personaje.x>zombi[nzom].x-personaje.scrollx-32 && personaje.x<zombi[nzom].x-personaje.scrollx+32){
personaje.col2=1;
}

else {
personaje.col2=0;
}


if (personaje.x>zombi[nzom].x-personaje.scrollx-32 && personaje.x<zombi[nzom].x-personaje.scrollx-20 && personaje.y>zombi[nzom].y-personaje.scrolly-64 && personaje.y < zombi[nzom].y-personaje.scrolly + 64){
personaje.col3 = 1;
}

else {
personaje.col3=0;
}

if (personaje.x<zombi[nzom].x-personaje.scrollx+32 && personaje.x>zombi[nzom].x-personaje.scrollx+20 && personaje.y>zombi[nzom].y-personaje.scrolly-64 && personaje.y < zombi[nzom].y-personaje.scrolly + 64){
personaje.col4 = 1;
}

else {
personaje.col4 = 0;
}



Mal del todo no puede estar porque si saco un solo zombi, colisiona, si saco varios, solo colisiona con uno (el promero que creo con mi funcion).

Todo el codigo que e puesto arriba es comprobado por el bucle principal, asi que no es ningun error tonto.

Aver si alguien tiene una idea para solucionar esto. No se si sera porque no comprueba todo el array (aunque no, porque si no lo comprovara hay muchas cosas que no funcionarian de mi codigo que si funcionan).

Hay lo dejo, si alguien sabe que me ayude.

salu2 y gracias
#Plata


Supongo que lo que has puesto esta dentro de un bucle for, que va variando el valor de nzomb no?
Puede que el problema este en otro punto, como en el sitio donde asignas la posicion de cada zombie. Comrpuebalo!
Suikoden77 escribió:#Plata


Supongo que lo que has puesto esta dentro de un bucle for, que va variando el valor de nzomb no?
Puede que el problema este en otro punto, como en el sitio donde asignas la posicion de cada zombie. Comrpuebalo!


No, porque mi funcion me permite poner la x y la y del zombi al salir donde quiera, y muchas otras cosas que de ser de la posicion (por ejemplo la ia) no funcionaria. Dejo de todas formas el binario para que pruebe quien quiera para ver que el error es MUY raro, entre antonio y yo no hemos conseguido encontrarlo.

He provado tambien a usar un array de estructuras para las variables que me devuelven que lado del personaje colisiona, pero no rula :S

salu2 y gracias

P.D: Al cargar el zombi, en realidad le divido en dos funciones, por ejemplo, si quisiese cargar dos zombis haria esto:


main(){

crearzombi(1, 300, 0); /* esta me carga lo que no puede estar en el bucle ( la creacion de un sprite, etc...)*/
crearzombi(2, 350, 0);

while(1){
cargarzombi(1); /* esta me carga lo que tiene que ser pasado por el bucle (ia, posicion, colisiones, etc...*/
cargarzombi(2);

}
return 0;
}

Las declaraciones:
void crearzombi(s32 num, s32 x, s32 y);
void cargarzombi(s32 nzom);


eso es a grandes rasgos.

Lo tengo todo eso bien ordenado en una funcion que ya me carga el mapa, los enemigos que quiera y no tengo que ir dejando mierda en main.c, pero que es lo de menos, funciona igualmente...

Adjuntos

Si antonio ya no sabe la solución lo llevamos claro entonces.

Así a primeras por lo que dices debería funcionar, ya que entiendo que por cada llamada a void cargarzombi(s32 nzom) se ejecuta el código que has introducido en la primera réplica para detectar la colisión. Si en el primer funciona en los otros también debería funcionar (pero esa es la mágia de la programación y la gracia).

Lo que no acabo de entender es que si conoces cuando un Zombie colisiona con el personaje (esto funciona bien dices), que necesidad tienes de comprobar después si el personaje colisiona con el zombie? No lo sabes ya?.

Aunque ya lo habrás hecho haz un debug, inicializa unos cuantos zombies en una posición en que todos ellos colisionen con el personaje y mira si funciona (esos maravillosos PA_Out.....). Y una última cosa, al leer:

No se si sera porque no comprueba todo el array (aunque no, porque si no lo comprovara hay muchas cosas que no funcionarian de mi codigo que si funcionan).


Cuando se empiezan a presuponer cosas sin comprovarlas directamente mal vamos XD.
frodonag escribió:Lo que no acabo de entender es que si conoces cuando un Zombie colisiona con el personaje (esto funciona bien dices), que necesidad tienes de comprobar después si el personaje colisiona con el zombie? No lo sabes ya?.


ya, pero hay un problema, la ia del zombi, resumiendo, se acerca, y cuando colisiona con tigo te ataca, asi que con detectar la colision general es suficiente, pero cuando colisiona el personaje, tengo ke saber con que lado colisiona para solo bloquearle el paso en esa direccion.

frodonag escribió:Aunque ya lo habrás hecho haz un debug, inicializa unos cuantos zombies en una posición en que todos ellos colisionen con el personaje y mira si funciona (esos maravillosos PA_Out.....).

lo extraño esque segun el debug funciona xDDDD

Y una última cosa, al leer:

No se si sera porque no comprueba todo el array (aunque no, porque si no lo comprovara hay muchas cosas que no funcionarian de mi codigo que si funcionan).


Cuando se empiezan a presuponer cosas sin comprovarlas directamente mal vamos XD.


Ya, pero esque es logico, no funcionaria NADA (bueno, si todo lo relacionado con el primer zombi que saco), en cambio hay puedes ver como el segundo zombi hace lo mismo que el primero, no puede ser problema de eso...



EDIT: Lo e semi-conseguido. He creado unas variables en el array del zombi y he pasao esa info a la estructura del personaje:

personaje.colision = zombi[nzom].colision;
personaje.col1 = zombi[nzom].col1;
personaje.col2 = zombi[nzom].col2;
personaje.col3 = zombi[nzom].col3;
personaje.col4 = zombi[nzom].col4;


Cuando mato al que colisiona pasa a colisionar el segundo, nada nuevo a parte de esto...

salu2
Probe el juego y decirte que no funcionaba bien. El segundo zombie no dirige la mirada hacia el personaje, asi que no creo que entres bien en los bucles. Salu2
frodonag escribió:Si antonio ya no sabe la solución lo llevamos claro entonces.

Tampoco te creas que me le hacía mucho caso antes mientras me hablaba para intentar solucionarlo... Estaba yo bastante desesperao intentando conseguir que GTK y SDL se llevasen bien... [+risas]
ANTONIOND escribió:
frodonag escribió:Si antonio ya no sabe la solución lo llevamos claro entonces.

Tampoco te creas que me le hacía mucho caso antes mientras me hablaba para intentar solucionarlo... Estaba yo bastante desesperao intentando conseguir que GTK y SDL se llevasen bien... [+risas]


Si, tampoco es que hicieses mucho caso, no... xDD Ni antes de conseguir compilar ni despues xDD pero que no, tio, que esto es rarisimo xDD

Le he metido caña a la funcion cargarzombi(); con un for para asegurarme de que rastrea todo el array, y voy a meter un debug de cada zombi individual aver que me dice...

Edit: Vale, segun el debug, TODO funciona bien, asi que sigo desconociendo la causa (u.u) me imagino que estara en main, voy a mirar...

EDIT 2: Ya he conseeguido hacer que colisionen perfectamente cambiando movidas de sitio, gracias a todos
7 respuestas