problema de colision

problema de colision

Notapor vib » Mar Dic 18, 2012 2:16 pm

Hola gente!
si lo se que esta es una question muy muy comun...pero ni los post ni internet a podido resolver mi duda -.-
Os dejo 2 imagenes del problema.
http://imageshack.us/f/811/pantallazota.png/
http://imageshack.us/photo/my-images/23 ... zo1fz.png/

Bien esta la pantalla que es el personaje " de fondo blanco" que colisiona con ese rectangulo de fondo negro.
Ok al lado os he dejado el codigo de colision y un escrito de colision.
Esto solo lo tengo hecho para el movimiento de derecha pero no me sale con nada.
cOMO SE ve, pone que la distancia x+w del personaje esta a 1 de la x del objeto a colision, cuando ya esta dentro y por tanto deberia colisiar.
Luego en la otra esta tocandose en misma coordenada y pone que aun le quedan 7 posiciones.
what????
No entiendo.
Solo quiero hacer un movimiento de... mueve si encuentras una colision no te muevas pero puedes moverte a las direcciones que no alla colision

Alguna ayuda plx :D
vib
 
Mensajes: 9
Registrado: Lun May 30, 2011 7:30 pm

Re: problema de colision

Notapor Barajas » Mié Dic 19, 2012 7:06 am

Bueno, veo que estas utilizando colisiones en base a rectángulos, (si bien, no es lo más recomendable para un juego basado en tiles, pero, funciona ;) ).

Asumo que el objeto "rect", es un atributo de la clase y que "col", es tu personaje. También, por la imagen del mapa y la forma del código de la colisión, puedo asumir que el ancho y alto del personaje es igual al del tile.

No veo nada malo en el código de la colisión, pero, por si las dudas, puedes intentar probar este código que adapte a tu caso...

//para tu caso...
bool animacion::colision(animacion col){
int x2,x1;
x2 = col.getx();
y2 = col.gety();
//nos ahorramos el if mandando directamente el resultado de la comparación
return (
(x2 < rect.x + TILESIZE_X) &&
(rect.x < x2 + TILESIZE_X) &&
(y2 < rect.y + TILESIZE_Y) &&
(rect.y < y2 + TILESIZE_Y)
);
};

//para el caso generico...
bool colision(SDL_Rect rect_a, SDL_Rect rect_b){
return (
(rect_a.x < rect_b.x + rect_ b.w) &&
(rect_b.x < rect_a.x + rect_a.w) &&
(rect_a.y < rect_b.y + rect_b.h) &&
(rect_b.y < rect_a.y + rect_a.h));
};


Y si continua sin funcionar, entonces, hay dos grandes preguntas que debes hacerte.

¿Seguro qué el "rect" corresponde al del tile del cual quieres revisar la colisión?
¿Como decides cuales de que objetos colisionan?

Me imagino que tienes una lista con todos los tiles del mapa que tienen colisión, y que revisas cada uno para ver con cual colisiona el personaje...

Bien, de cualquier forma, espero poder ayudarte. :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: problema de colision

Notapor vib » Mié Dic 19, 2012 12:17 pm

Gracias por contestar.
Escribi el post demasiado rapido y no me explique bien.
La colision la produce una clase llamada animacion
que contiene el rectangulo que se imprime en pantalla, x,y,w,h
La llama yo "osea el personaje que estoy usando" y col es el objeto a colisionar.

En la foto, la colision no es con el mapa, quizas debi poner otro sprite para que se viera mejor xD...
La colision es con otro objeto ya sea un arbol o una mesa.
La deteccion de colision, ya me lo hace lo que como se ve en una de las imagenes...

Pone que estoy a 1 pixel de distancia con el cuadrado y por tanto no hay colision
pero se ve claramente que la imagen ya esta dentro del objeto a colisionar... y nose porque.

Mi duda es la siguiente...Mi personaje puedo moverlo arriba,abajo,izkierda,derecha o convinado.
El problema esque si hago la funcion colision...me dice si esta en colision..
y claro digo si esta en colision no te muevas...
Y claro no me deja moverme para ningun lado
La duda era como puedo hacerlo para que si colisiono por 1 de los lados pueda seguir moviendome libremente por los lados que no existe la colision?

Esque se me ocurre la manera de dividr la funcion colision entre 4, col_derecha, col,_izkierda...i si colisiono desde la derecha, se desactiva la tecla para ir en este caso a la izkierda y asi succesivamente
pero creo que es una manera muy costosa y xapucera
Como se haria realmente?
Mexi :D
vib
 
Mensajes: 9
Registrado: Lun May 30, 2011 7:30 pm

Re: problema de colision

Notapor Barajas » Mié Dic 19, 2012 7:39 pm

Ok, intenta con mandar a la función genérica las rectas de los objetos que quieres ver si colisionan.
Lo bonito de la función que te mostré es que no importa cual sea, detecta una colisión entre ellos.

vib escribió:Pone que estoy a 1 pixel de distancia con el cuadrado y por tanto no hay colision
pero se ve claramente que la imagen ya esta dentro del objeto a colisionar... y nose porque.


Eso puede deberse a que orden esta tu bucle. Intenta primero poner con lo que revisas si se presionan teclas, después, los métodos en los cuales actualizas los elementos del juego, y finalmente los dibujas.

vib escribió:Esque se me ocurre la manera de dividr la funcion colision entre 4, col_derecha, col,_izkierda...i si colisiono desde la derecha, se desactiva la tecla para ir en este caso a la izkierda y asi succesivamente
pero creo que es una manera muy costosa y xapucera
Como se haria realmente?


es posible, pero es mejor que pruebes con esta lógica: ¿Si lo muevo, chocara con algo?. Lo que se hace, es crear una nueva rect con la posición del personaje si lo moviéramos, revisar si choca con algo. Si no choca con nada, obviamente nuestro personaje si lo movemos no chocara y podemos sumar la posición. Si choca con algo esa nueva rect, asumimos que si movemos al personaje a esa posición chocara, y por eso no lo movemos.

En pseudocódigo:

if presiona tecla derecha:
//esta es la posición del personaje, y creamos una copia.
nueva_rect = rect_personaje
//a esa copia, le sumamos el correspondiente aumento en la posición...
nueva_rect.x += aumento_derecha
//y revisamos si choca esa recta con el aumento con algo más...
if no (la nueva_rect choca con algo):
//y en caso de que no choque, le aumentamos la posición.
rect_personaje.x+=aumento_derecha


Tal vez en la semana creo un pequeño ejemplo. Si tienes dudas, solo pregunta.
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: problema de colision

Notapor vib » Mié Dic 19, 2012 10:14 pm

Gracias por tu ayuda
ya me ha salido aunque tiene un pequeño inconveniente
Bueno el codigo de como me ha quedado es este
bool animacion::colision(animacion col, int dir,int vel)
{
///mira si la proxima posicion colisiona
int x2, y2;
SDL_Rect reflejo;
reflejo=rect;
x2 = col.getx();
y2 = col.gety();
if(dir==0) reflejo.x+=vel;//derecha
if(dir==1) reflejo.x-=vel;//iz
if(dir==2) reflejo.y-=vel;//ar
if(dir==3) reflejo.y+=vel;//abajo

return( ((reflejo.x+TILESIZE_X)>x2) and
((reflejo.y+TILESIZE_Y)>y2) and
((x2+TILESIZE_X)>reflejo.x)and
((y2+TILESIZE_Y)>reflejo.y) );
}
////////////
No se me habia ocurrido mirar si colisionaba antes de mover xD gracias por iluminarme jeje
El caso esque tiene una pequeña secuela que ami personalmente me complica el codigo y quizas tu lo veas con una perpectiva quedando un codigo mejor.
Esta funcion ya va genial pero pongamos que mi personaje corre 6 pixels por movimiento
ok perfecto
pero si por algun caso esa velocidad augmenta a por ejemplo haciendolo exagerado 20
entonces detecta la colision antes de que realmente se produzca.
Yo queria implementar algo de por ejemplo
existe colision? si, ok que distancia estas con la colision? en 18 posiciones en vez de 20? ok pues avanza 17 posiciones.
Para que poniendo la velocidad que quiera siempre exista un realismo de colision.
Para esto tengo esta funcion
int animacion::distancia(animacion col)
{
//derecha
int distancia=col.getx()-(rect.x+CHARSIZE_X);
cout<<"obj "<<col.getx()<<" yo "<<(rect.x+CHARSIZE_X)<<" = "<<col.getx()-(rect.x+CHARSIZE_X)<<endl;
return col.getx()-(rect.x+CHARSIZE_X);

}
Echa solo para derecha pero seria hacerla con un if y hacerlo para todas las direcciones...
Y luego en el loop que miro la colision hacer:

if(!yo.colision(obj,0,yo.getvel()))mapa.movlateral(yo.getvel());
else mapa.movlateral(yo.distancia(obj));

Esto funciona, y tu ayuda me a servido mucho..te pongo esto en el comentario por si conoces alguna manera mas elegante de hacerla sino dejare esta y ya esta
:D
vib
 
Mensajes: 9
Registrado: Lun May 30, 2011 7:30 pm


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado