Bien, entonces este es un problema que he estado tratando de resolver por bastante tiempo. El mío es un juego de plataformas en 2D con un mundo compuesto (generalmente) de fichas inmóviles y sprites móviles, los cuales usan AABB para representar sus hitboxes. Este juego NO está basado en cuadrículas debido a algunas complicaciones con el movimiento de capas de fichas.
Puedo detectar colisiones y determinar fácilmente la profundidad de la colisión. Utilizo el "método del eje menos profundo" para determinar la forma de resolver una colisión entre el sprite y el mosaico. Si el sprite es más profundo horizontalmente que verticalmente, la dirección para resolver es hacia arriba o hacia abajo. Si el sprite es más profundo verticalmente que horizontalmente, la dirección para resolver es izquierda o derecha.
Esto es bastante simple y funciona bastante bien. Es decir, hasta que tenga un sprite que choca con más de una ficha. Como, por su naturaleza, cada colisión debe verificarse por separado, las diferentes colisiones pueden tener una dirección diferente para resolver. Por ejemplo, si un sprite está tratando de caminar a través de una fila de fichas, para un cuadro se cruzarán con la siguiente ficha. que la profundidad horizontal es más corta que la profundidad vertical. Como la colisión dice "resolver a la izquierda", se retrasará y quedará atascado en la esquina.
He estado reflexionando sobre este problema una y otra vez durante bastante tiempo, y se me han ocurrido varias soluciones, pero todas tienen fallas. Podría marcar ciertos lados como inalcanzables, pero sin un motor basado en la cuadrícula, determinar la "inalcanzabilidad" es notablemente complejo, especialmente con la posibilidad de mover capas de mosaicos.
Otro método posible sería predecir colisiones antes de que sucedan y "retroceder" el movimiento hasta el punto de la colisión, supongo, pero no estoy seguro de cómo funcionan las matemáticas.
Siento que me falta algo increíblemente obvio, especialmente porque los juegos de los años 80 ya han resuelto este problema.