Я проверяю столкновение для персонажа платформера, как показано в # 1. Красные точки - это проверенные пиксели, а серые линии обозначают оси, к которым они относятся. Мне нравятся результаты, которые я получаю от проверки столкновения таким образом (в отличие от, скажем, ограничивающего прямоугольника). Все работает именно так, как я хотел бы, за исключением одной проблемы: обнаружение раздавливания.
На следующих изображениях голубой прямоугольник представляет землю, оранжевый прямоугольник - объект, а стрелки указывают направление движения.
Простое решение для определения, когда игрок сокрушен, состоит в том, чтобы видеть, срабатывают ли точки столкновения на противоположных сторонах. Если они есть, игрок сокрушен. В # 2 вы можете увидеть нормальный сценарий разгрома. Игрок заземлен, а верхние точки столкновения пересекаются с падающим объектом. Это вызывает влюбленность.
№ 3, 4 и 5 представляют проблемные сценарии. В # 3 игрок движется к объекту, который движется вверх. Правая точка столкновения поражает объект, вызывая столкновение и останавливая игрока.
Теперь, если объект продолжает двигаться вверх, а игрок продолжает двигаться вправо (как показано на # 4), объект очищает точку столкновения правой стороны игроков, и игрок перемещается вправо. Но теперь, сделав это, объект пересекает верхнюю точку столкновения, вызывая нежелательное вертикальное раздавливание.
Аналогичный сценарий показан в # 5. Два объекта находятся достаточно далеко друг от друга, чтобы очистить нижние точки столкновения, позволяя игроку упасть, но не настолько, чтобы позволить точкам бокового столкновения очиститься, вызывая нежелательное горизонтальное раздавливание.
Я ломал голову над решением, но ничего из того, что я придумал, не сработало особенно хорошо, поэтому мне интересно, есть ли у кого-нибудь идея или понимание того, как решить эти проблемы.
Чтобы устранить некоторую путаницу, красные точки столкновения должны были находиться внутри спрайта, а серые линии использовались только для обозначения соответствующей оси для каждой точки столкновения. Например, если спрайт персонажа был простым зеленым квадратом, точки столкновения выглядели бы примерно так: