Платформа и физика
Эти крайние случаи многочисленны. Хорошие забавные платформеры не ведут себя физически точным образом, а управление и поведение, которого ожидают игроки после многих лет «совершенных» платформеров, таких как Mario, невероятно сложно реализовать с помощью общих методов, таких как Box2D или другие физические движки. Большинство хороших платформеров не используют какую-либо общую физику или реакцию на столкновение в своих контроллерах игроков.
Генерировать корпуса
Что касается вашего конкретного вопроса, лучшее решение состоит в том, чтобы прекратить использовать коробки в качестве основы. Используйте серию соединенных отрезков (корпус). Это позволяет механизму обнаружения столкновений фокусироваться только на реально проходимых поверхностях, а не смотреть на «фальшивый» край, который существует между AB и BC. Именно это и делает Box2D. Формы используются для создания внешних поверхностей, которые связаны вместе, чтобы сформировать корпус.
Это необходимо даже в играх на основе тайлов или в ситуациях, когда у вас есть два объекта AABB рядом с другими, выступающими в качестве пола. Движок столкновения подхватит эти вертикальные края и заставит игрока ловить их. Есть взломы, которые могут помочь, но не устранить проблему. Решение состоит в том, чтобы иметь только один отрезок, представляющий поверхность, а не полный 2D-блок.
Вы можете генерировать оболочки в общем случае, обрезая многоугольники друг против друга и соединяя точки клипов в списке ребер.
Наклонные поверхности
Поскольку ваш пример включает в себя уклон, и вы упоминаете реституцию и другие физические свойства, я укажу на несколько других проблем, которые вы скоро заметите, что дополнительно иллюстрирует, почему общее обнаружение столкновений и реагирование не работают хорошо для платформеров. Сначала попытайтесь встать на наклонную платформу, подпрыгните, а затем приземлитесь. Вы, вероятно, заметите, что персонаж немного «скользит» при приземлении. Проблема в том, что нормальный контакт, который вы генерируете, обычно будет направлен от наклонной поверхности. Затем при разрешении столкновения игрок выталкивается в этом направлении. Даже если персонаж упал прямо вниз, он будет толкаться вверх и немного вправо при приземлении, что приведет к скольжению. Это можно взломать, принимая во внимание относительные скорости,
Вторая проблема, которую вы заметите, решить которую гораздо сложнее, - это то, что происходит, когда вы пытаетесь быстро спуститься по трапу. Игрок собирается «прыгать» вниз по трапу. Это очень заметно даже в большинстве игр ААА сегодня. Это не только выглядит глупо, но если ваша игра требует, чтобы игрок был на ногах по земле, чтобы прыгать, это затрудняет бег по рампе и прыжок на полпути, потому что игрок контактирует с рампой только в течение небольшой части время потраченное на это. Более простой способ - просто сделать несколько лучей, когда игрок двигается, и привязать положение игрока к ближайшей поверхности (если оно очень близко к игроку), если игрок не прыгает и ранее находился на земле.
Вы также можете обнаружить, что игрок запускается в воздух, когда бежит по рампе, если вы пытаетесь смоделировать скорость, трение и восстановление на игроке, как если бы он был обычным твердым телом. Движение игрока должно быть ограничено горизонтальным движением, кроме случаев падения / прыжка. Конечно, если вы играете в старые платформеры золотого века, вы можете заметить, что горизонтальная скорость игрока часто постоянна между горизонтальными и наклонными поверхностями. Это необходимо учитывать при ходьбе вверх / вниз по склонам.
Будет много других странных случаев, с которыми вы тоже столкнетесь. Если вы пытаетесь сделать хороший платформер, лучше всего реализовать контроллер плейформера отдельно от физики и жестко задавать желаемое движение и поведение управления, а не полагаться на общую физику и алгоритм реагирования на столкновения.