Итак, это проблема, которую я пытался выяснить уже довольно давно. Mine - 2D платформерная игра с миром, состоящим из (обычно) неподвижных плиток и мобильных спрайтов, которые используют AABB для представления своих хитбоксов. Эта игра НЕ основана на сетке из-за некоторых сложностей с перемещением слоев плиток.
Я могу обнаружить столкновения и легко определить глубину столкновения. Я использую «метод наименьшей оси», чтобы определить, каким образом разрешить столкновение между спрайтом и плиткой. Если спрайт расположен глубже по горизонтали, чем по вертикали, то направление разрешения - вверх или вниз. Если спрайт находится глубже по вертикали, чем по горизонтали, направление разрешения - левое или правое.
Это достаточно просто и работает довольно хорошо. То есть до тех пор, пока спрайт не столкнется с более чем одним тайлом. Поскольку по своей природе каждое столкновение должно проверяться отдельно, разные столкновения могут иметь разное направление для разрешения. Например, если спрайт пытается пройти по ряду плиток, для одного кадра они будут пересекать следующую плитку, например что горизонтальная глубина меньше, чем вертикальная глубина. Поскольку столкновение говорит «разрешить влево», оно будет отброшено назад и застрянет в углу.
Я обдумывал эту проблему снова и снова в течение достаточно долгого времени, и ко мне пришли несколько решений, но у всех есть недостатки. Я мог бы пометить некоторые стороны как недостижимые, но без движка на основе сетки определение «недостижимости» является чрезвычайно сложным, особенно с возможностью перемещения слоев плиток.
Я полагаю, что другим возможным способом было бы предсказать столкновения до того, как они произойдут, и «отработать» движение до точки столкновения, но я не уверен, как работает математика для этого.
Я чувствую, что упускаю что-то невероятно очевидное, тем более что игры 80-х уже решили эту проблему.