Estoy comprobando la colisión de un personaje de plataformas como se muestra en el n. ° 1. Los puntos rojos son los píxeles que están marcados y las líneas grises indican los ejes a los que pertenecen. Me gustan los resultados que obtengo al verificar la colisión de esta manera (versus, por ejemplo, el cuadro delimitador). Todo funciona exactamente como me gustaría, excepto por un problema: la detección de aplastamiento.
En las siguientes imágenes, el cuadro azul claro representa el suelo, el cuadro naranja es un objeto y las flechas indican la dirección del movimiento.
La solución simple para detectar cuándo el jugador es aplastado es ver si los puntos de colisión en lados opuestos se disparan. Si lo están, el jugador está siendo aplastado. En el n. ° 2, puede ver un escenario de enamoramiento normal. El jugador está conectado a tierra y los puntos de colisión superiores se cruzan con el objeto que cae. Esto desencadena un flechazo.
# 3, 4 y 5 presentan escenarios problemáticos. En el n. ° 3, el jugador se mueve hacia el objeto, que se mueve hacia arriba. Un punto de colisión del lado derecho está golpeando el objeto, causando una colisión y deteniendo al jugador.
Ahora, si el objeto continúa subiendo y el jugador continúa moviéndose hacia la derecha (como se muestra en el n. ° 4), el objeto despeja el punto de colisión del lado derecho del jugador y el jugador se mueve hacia la derecha. Pero ahora, una vez hecho esto, el objeto está cruzando un punto de colisión superior causando un aplastamiento vertical no deseado.
Un escenario similar se muestra en el n. ° 5. Dos objetos están lo suficientemente separados como para despejar los puntos de colisión inferiores, lo que permite que el jugador caiga, pero no tanto como para permitir que los puntos de colisión laterales se despejen, causando un aplastamiento horizontal no deseado.
He estado investigando una solución, pero nada de lo que se me ocurrió ha funcionado particularmente bien, por lo que me pregunto si alguien por ahí tiene una idea o una idea de cómo resolver estos problemas.
Para aclarar alguna confusión, los puntos de colisión rojos estarían dentro del sprite y las líneas grises solo se usaron para denotar el eje relevante para cada punto de colisión. Por ejemplo, si el sprite del personaje fuera un simple cuadrado verde, los puntos de colisión se verían así: