Как проверить столкновение между линией и прямоугольником в Pygame? - PullRequest
1 голос
/ 12 мая 2019

Я сейчас создаю игру на python с pygame, и мой ИИ в настоящее время «видит» моего персонажа через стены и стреляет в него, но ИИ не должен стрелять.Итак, мой вопрос: как это предотвратить?Я думал о столкновении линий, когда линия идет от моего ИИ к моему персонажу, и если эта линия сталкивается со стеной, то этот ИИ не стреляет.Любая помощь будет оценена, большое спасибо!

1 Ответ

1 голос
/ 13 мая 2019

Это отличный вопрос!

Ваш прямоугольник можно представить как 4 строки:

(x, y)        → (x+width, y)        # top
(x+width, y)  → (x+width, y+height) # right
(x, y+height) → (x+width, y+height) # bottom
(x, y)        → (x, y+height)       # left 

Взяв вашу пересекающуюся линию, можно использовать формулу для пересекающихся двух линий *1007*, чтобы определить, пересекается ли какая-либо из этих линий (но будьте осторожны с параллельными линиями!)

Однако формула (указанная в связанной статье в Википедии) определяет, пересекаются ли линии где-либо на 2D-плоскости, поэтому ее необходимо дополнительно уточнить. Очевидно, что код может быстро отбрасывать любые пересечения, которые происходят за пределами размеров окна.

Как только точка столкновения "бесконечной плоскости" была определена (что является достаточно быстрым определением), тогда можно определить более мелкозернистое пересечение. Используя алгоритм Брезенхэма , перечислите все точки пересекающейся линии и сравните их с 1-пиксельным прямоугольником, основанным на каждой стороне вашего квадрата. Это скажет вам, какая сторона прямоугольника пересеклась.

Если вам нужно только узнать, был ли выбран прямоугольник, просто проверьте весь прямоугольник с помощью pygame.Rect.collidepoint() для каждой точки в линии.

enter image description here

Конечно, после того, как вы сгенерировали все эти точки, легко не беспокоиться о столкновении 2D-линий, но для длинных линий код должен выполнять много проверок. Поэтому тестирование 2D-пересечения сначала действительно ускоряет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...