Я пишу 2D-игру XNA сверху вниз. Так как это мой первый опыт, я сам пытаюсь написать материал по физике и столкновениям, чтобы изучить его.
Всякий раз, когда мой спрайт-игрок пытается переместиться в положение, где его границы пересекаются с краем стены, я определяю угол отскока (угол падения = угол отражения) и заставляю игрока отскакивать от стены и избегать столкновения. ,
У меня проблемы с выяснением, как справиться с ситуацией, когда мой спрайт пересекается с двумя краями стены одновременно, хотя, например, он попадает в угол.
Мой код в настоящее время говорит мне, что два края стены были пересечены, но не то, по какому краю он бы ударил первым и, следовательно, по какому краю отскочить.
Что такое математический тест, чтобы выбрать, какой край отскочить? Это легко увидеть, глядя на это, но я изо всех сил пытаюсь выяснить математический тест для этого.
Ответы:
Если подсчитать , как далеко в переместилась, вы , вероятно , может основывать его на дельте х и у координаты углов, которые пересекаются. Я надеюсь, что это имеет смысл, я не могу придумать лучшего способа выразить это.
Wall
Player Sprite
Так, например, если вы посмотрите на свою диаграмму. Возьмите
x
значение верхнего левого углаPlayer Sprite
(после перемещения) и вычтитеx
значение нижнего правого углаWall
. Сделайте то же самое дляy
значений, а затем посмотрите, какое из них больше. Ключ в том, что если один больше другого, то,Player Sprite
вероятно, пересекается на этой стороне.Вот пример изображения (это подраздел вашего изображения с добавленными моими собственными строками):
Теперь вы видите, что синяя линия больше, чем зеленая. В этом случае синяя линия также находится на той стороне, от
Player Sprite
которой можно было бы ожидать отскока.Если два значения равны, они попадают прямо в угол.
Теперь есть небольшая проблема с этим. Если
Player Sprite
он движется очень быстро или столкновение находится очень близко к углу, возможно, что оноPlayer Sprite
пойдет дальшеWall
в неправильном направлении. В этом случае вам, вероятно, придется проверить скорость движущегося объекта. (См . Ответ Натана Рида .)Примечание: я думаю, что по сути пытаюсь описать обнаружение коллизий SAT, о котором упоминал @Blau, но я потратил много времени на написание этого, поэтому я все равно опубликую его. Надеюсь, это поможет вам.
источник
Минимальное смещение не всегда дает правильный ответ, для которого край был достигнут первым. Рассмотрим этот случай:
Это происходит, когда скорость достаточно высока, чтобы блок перемещался довольно далеко в течение одного кадра. Чтобы правильно определить, какое ребро было нанесено первым, вам нужно будет установить линейное уравнение, которое нужно решить на время столкновения с каждым ребром. В этом случае, описанном в схеме ОП, соответствующие уравнения:
(Предполагается, что система координат по оси Y направлена вверх по оси Y.) В общем, вам придется использовать знаки компонентов X и Y player.velocity, чтобы определить, какую пару ребер необходимо проверить. В любом случае, как только вы вычислили время столкновения, более раннее из двух столкновений - это то, с чем вам нужно справиться.
источник
Вам нужно SAT Collision Detection
По сути, вам нужно искать минимальный вектор смещения, который вычитается одному из объектов, чтобы они не пересекались.
На вашем изображении минимальное смещение - оранжевый сегмент.
источник
Ответили на подобный вопрос здесь
Вы можете рассмотреть возможность проверки предыдущих позиций
Например: если ваша левая сторона была ранее справа от их правой стороны, и вы сталкиваетесь, то произошло столкновение правой руки.
Если вы сделаете это, просто разрешите столкновения по оси Y, проверьте, сталкиваетесь ли вы с чем-либо, затем разрешите столкновения по оси X.
источник