Интересный вопрос, я разрабатывал игру в Delphi несколько лет назад и столкнулся с теми же проблемами.Пара баллов:
- Вы должны исправить X и Y при столкновении.Исправление только X или Y будет выглядеть неестественно с высокими скоростями (более ~ 3px / обновление).
- Тип обнаружения столкновений, который вы делаете, будет работать с прямоугольными плитками, но если у вас были неправильные плитки (как треугольник для наклонного участка), тогда было бы невозможно вычислить значения коррекции для столкновения.
В конце я сделал движок, в котором каждая плитка имела битовую карту (фактическая видимая графика) и что-то, что я назвал freemap , который был черно-белым растровым изображением, представляющим карту свободного пространства в плитке.Затем я написал функции столкновения, которые работали сначала в пространстве тайлов (для определения тайлов, которые сталкиваются с игроком), а затем в растровом изображении тайла.
При перемещении игрока вы вычисляете следующую точку на основе скорости игрока, а затем вы проверяете каждую точку вдоль линии между текущей позицией и вычисленной следующей позицией.Если на этой линии вы столкнетесь с препятствием, вы остановите игрока в этой точке.