Проблемы столкновения 2D-платформеров AABB

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif

У меня проблема с разрешением коллизий AABB.


Я разрешаю пересечение AABB, разрешая X сначала ось, затем ось Y. Это сделано для предотвращения этой ошибки: http://i.stack.imgur.com/NLg4j.png


Текущий метод работает нормально, когда объект перемещается в игрока, и игрок должен толкать горизонтально. Как вы можете видеть в .gif, горизонтальные шипы толкают игрока правильно.


Однако, когда вертикальные шипы входят в игрока, ось X по-прежнему разрешается первой. Это делает невозможным «использование шипов в качестве подъемника».

Когда игрок движется по вертикальным шипам (под действием силы тяжести, падает в них), он толкается по оси Y, потому что с самого начала не было перекрытия по оси X.


Я кое-что попробовал, это метод описано в первом ответе по этой ссылке . Однако шипы и движущиеся объекты перемещаются за счет изменения их положения, а не скорости, и я не вычисляю их следующее предсказанное положение, пока не будет вызван их метод 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. Но это мешает столкновению с шипами, как я сказал выше.

6
задан Community 13 April 2017 в 12:18
поделиться