D'accord, c'est donc un problème que j'essaie de comprendre depuis un certain temps. Le mien est un jeu de plateforme 2D avec un monde composé (généralement) de tuiles immobiles et de sprites mobiles, qui utilisent tous deux des AABB pour représenter leurs hitbox. Ce jeu n'est PAS basé sur une grille en raison de certaines complications liées au déplacement des couches de tuiles.
Je peux détecter les collisions et déterminer facilement la profondeur de la collision. J'utilise la «méthode de l'axe le moins profond» pour déterminer la façon de résoudre une collision entre le sprite et la tuile. Si le sprite est plus profond horizontalement que verticalement, la direction à résoudre est soit vers le haut soit vers le bas. Si le sprite est plus profond verticalement qu'horizontalement, la direction à résoudre est à gauche ou à droite.
C'est assez simple et cela fonctionne plutôt bien. Autrement dit, jusqu'à ce qu'un sprite entre en collision avec plusieurs tuiles. Comme, de par leur nature, chaque collision doit être vérifiée séparément, différentes collisions peuvent avoir une direction différente à résoudre. Par exemple, si un sprite essaie de traverser une rangée de tuiles, pour une image, il coupera la tuile suivante telle que la profondeur horizontale est plus courte que la profondeur verticale. Comme la collision dit "résoudre à gauche", elle sera repoussée et coincée dans le coin.
Je réfléchis à ce problème, depuis un certain temps, et plusieurs solutions m'ont été proposées, mais toutes ont des défauts. Je pourrais marquer certains côtés comme inaccessibles, mais sans moteur basé sur une grille, déterminer "l'inaccessibilité" est remarquablement complexe, en particulier avec des couches de tuiles mobiles toujours une possibilité.
Une autre méthode possible serait de prédire les collisions avant qu'elles ne se produisent et de "reculer" le mouvement jusqu'au point de la collision, je suppose, mais je ne sais pas comment les calculs à ce sujet fonctionnent.
Je sens que je manque quelque chose d'incroyablement évident, d'autant plus que les jeux des années 80 ont déjà résolu ce problème.