Hola,
yo creo que una cosa es detectar la colision, y otra la respuesta a la misma.
Como dicen blau y fjfnaranjo hay comprobaciones simples para detectar si dos rectangulos en un plano se intersectan, y para calcular la interseccion resultante.
Detectar con que lado se produce la colision, es complicado si como dices los rectangulos varian, algunos se mueven, otros, no, unos son mas grandes que otros, etc, etc.
Como siempre: divide y venceras. Lo primero separa la deteccion (si quieres tambien puedes obtener la interseccion en el mismo metodo) de la respuesta. Un ejemplo de posibles metodos de deteccion (en pseudocodigo rollo UML), si quieres separar:
Luego separa el procesado de la colision/respuesta con el escenario:
Para un mario (estilo clasico) compuesto por mapas de celdas o tile maps, una capa de tile map sirve de colision. Ademas en esa capa cada tile de colision puede tener sus propiedades, como por ejemplo "suelo", "techo", "pared", etc...
Si lo que tienes son una "coleccion" de rectangulos para definir las colisiones del mapa, te aconsejo que les añadas estas propiedades, u otras parecidas. Esto te puede ayudar a saber que tipo de respuesta debes procesar.
Esto te ayudaria a reducir el coste de proceso, ya que tienes informacion "precalculada".
Esto te debe servir para calcular la colision/respuesta con el escenario con todos los personajes (player, enemigos, ...)
En cuanto a las colisiones entre "sprites" (personaje, enemigos, items, oloquequieras) no entiendo para que quieres saber la direccion.
Si lo que quieres es saber si estas pisando a un enemigo rollo salto mario es facil (suponiendo que el eje de coordenadas este en el borde superior izquierdo):
personaje.y < enemigo.y && personaje.isJump
Espero que esas sean las respuestas a tus dudas ^_^'
Un saludo
EDIT: depues de releer creo que he entendido un poco mejor la pregunta Oo
Primero mola saber la velocidad del sprite. pero sin velocidad:
* Si como dices todo rect de escenario debe ser mayor que el rect del personaje:
yo creo que una cosa es detectar la colision, y otra la respuesta a la misma.
Como dicen blau y fjfnaranjo hay comprobaciones simples para detectar si dos rectangulos en un plano se intersectan, y para calcular la interseccion resultante.
Detectar con que lado se produce la colision, es complicado si como dices los rectangulos varian, algunos se mueven, otros, no, unos son mas grandes que otros, etc, etc.
Como siempre: divide y venceras. Lo primero separa la deteccion (si quieres tambien puedes obtener la interseccion en el mismo metodo) de la respuesta. Un ejemplo de posibles metodos de deteccion (en pseudocodigo rollo UML), si quieres separar:
Código [Seleccionar]
HayColision(rectA : Rect, rectB : Rect) : boolean
Intersectan(rectA : Rect, rectB : Rect, out rectC : Rect) : bool
Luego separa el procesado de la colision/respuesta con el escenario:
Para un mario (estilo clasico) compuesto por mapas de celdas o tile maps, una capa de tile map sirve de colision. Ademas en esa capa cada tile de colision puede tener sus propiedades, como por ejemplo "suelo", "techo", "pared", etc...
Si lo que tienes son una "coleccion" de rectangulos para definir las colisiones del mapa, te aconsejo que les añadas estas propiedades, u otras parecidas. Esto te puede ayudar a saber que tipo de respuesta debes procesar.
Esto te ayudaria a reducir el coste de proceso, ya que tienes informacion "precalculada".
Esto te debe servir para calcular la colision/respuesta con el escenario con todos los personajes (player, enemigos, ...)
En cuanto a las colisiones entre "sprites" (personaje, enemigos, items, oloquequieras) no entiendo para que quieres saber la direccion.
Si lo que quieres es saber si estas pisando a un enemigo rollo salto mario es facil (suponiendo que el eje de coordenadas este en el borde superior izquierdo):
personaje.y < enemigo.y && personaje.isJump
Espero que esas sean las respuestas a tus dudas ^_^'
Un saludo
EDIT: depues de releer creo que he entendido un poco mejor la pregunta Oo
Primero mola saber la velocidad del sprite. pero sin velocidad:
* Si como dices todo rect de escenario debe ser mayor que el rect del personaje:
Código [Seleccionar]
Result res = NADA;
if (Intersectan(player.rect, collider, out intersecion) )
{
if (interseccion.w == player.rect.w && interseccion.h == player.rect.h) return DENTRO; // Opcional
if (interseccion.w > 0)
{
res |= (player.rect.left < collider.right) ? RIGHT : LEFT;
}
if (interseccion.h > 0)
{
res |= (player.rect.bottom > collider.up) ? DOWN : UP;
}
}
return res;
