У меня проблема с разрешением коллизий AABB.
Я разрешаю пересечение AABB, сначала разрешив ось X, а затем ось Y. Это сделано для предотвращения этой ошибки: http://i.stack.imgur.com/NLg4j.png
Текущий метод работает хорошо, когда объект перемещается в игрока, и игрок должен быть перемещен горизонтально. Как вы можете видеть в .gif, горизонтальные шипы толкают игрока правильно.
Однако когда вертикальные пики попадают в игрока, ось X все еще разрешается первой. Это делает невозможным использование шипов в качестве подъемника.
Когда игрок движется по вертикальным шипам (под воздействием силы тяжести, падает в них), его толкают по оси Y, потому что не было никакого перекрытия по оси X с самого начала.
Что-то, что я попробовал, был метод, описанный в первом ответе этой ссылки: 2D обнаружение столкновения прямоугольного объекта
Однако шипы и движущиеся объекты перемещаются, изменяя их положение, а не скорость, и я не вычисляю их следующую прогнозируемую позицию до тех пор, пока не будет вызван их метод Update (). Излишне говорить, что это решение тоже не сработало. :(
Мне нужно решить коллизию AABB таким образом, чтобы оба описанных выше случая работали как задумано.
Это мой текущий исходный код столкновения: http://pastebin.com/MiCi3nA1
Я был бы очень признателен, если бы кто-то мог разобраться в этом, поскольку эта ошибка присутствовала в движке с самого начала, и я изо всех сил пытался найти хорошее решение, но безуспешно. Это серьезно заставляет меня проводить ночи, глядя на код столкновения, и мешает мне перейти к «забавной части» и кодированию логики игры :(
Я попытался реализовать ту же систему коллизий, что и в демонстрационной платформе XNA AppHub (скопировав большую часть материала). Однако в моей игре возникает «прыгающая» ошибка, а в демке AppHub ее нет. [прыгающая ошибка: http://i.stack.imgur.com/NLg4j.png ]
Чтобы прыгнуть, я проверяю, находится ли игрок на «OnGround», затем добавляю -5 к Velocity.Y.
Поскольку Velocity.X игрока выше, чем Velocity.Y (см. Четвертую панель на диаграмме), onGround устанавливается в true, когда этого не должно быть, и, таким образом, позволяет игроку прыгать в воздухе.
Я полагаю, что этого не происходит в демоверсии AppHub, потому что Velocity.X игрока никогда не будет выше Velocity.Y, но я могу ошибаться.
Я решил это раньше, решив сначала по оси X, а затем по оси Y. Но это усиливает столкновение с шипами, как я уже говорил выше.