Расскажу, как поступал я. Писал на Java ME, так что особо сложных идей не было.
У каждой плитки была алгоритмически заданная поверхность (pavement). В более новых версиях движка приделали и потолок — впрочем, неважно.
Для простоты введём несколько ограничений. Все они, разумеется, обходятся усложнённой логикой.
• Ни на чём, кроме плиток, персонаж стоять не может. Тогда можно обойтись флагом: isSupported: true/false.
• Поднимаясь по склону, персонаж не ударится головой в потолок. Кстати, у нас было два разных геймдиза и два разных подхода — когда один увидел этот баг, пошёл жаловаться, второй взял ограничение на карандаш и не делал таких уровней.
• Неровности достаточно велики, чтобы можно было проверить ноги слева и ноги справа — и понятно, на какой высоте ему стоять.
• Соотношение «площадь ног / размер хитбокса» достаточно велико, чтобы, пока персонаж падает, его гарантированно вытолкнуло из стены.
В зависимости от скорости персонажа и крутизны склонов подберём epsilon — диапазон поиска поверхности.
Предположим, наш персонаж стоит на чём-то и двигаем его вправо.
1. Сдвинем его туда, где он должен быть.
2. Попробуем подстроить высоту, взяв правую сторону ног и отыскав новую поверхность в диапазоне (y — epsilon, y + epsilon). То же самое с левой стороной ног. То, что выше — и есть наш новый y. Если не получилось — УПИРАЕТСЯ (см. шаг 3).
3. Если на шаге 2 персонаж не упирается в стену, проверим на упор весь хитбокс. Если упирается — вытолкнем его из стены, снова подстроим высоту по принципу 2.