如何在pygame中检查直线和矩形之间的碰撞?

时间:2019-05-12 15:08:49

标签: python pygame

我目前正在使用pygame用python创建游戏,而我的AI目前正通过墙壁“看到”我的角色并射击,但是AI不应射击。所以我的问题是:如何预防?我想到了一条线碰撞,该线从我的AI到我的角色,如果这条线撞到墙,则该AI不会射击。 任何帮助将不胜感激,非常感谢!

1 个答案:

答案 0 :(得分:1)

这是一个很好的问题!

您的矩形可视为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 

采用相交的线,可以使用two-lines intersecting formula确定其中任何一条线是否相交(但要注意平行线!)

但是,公式(在链接的Wikipedia文章中指定)确定线是否在2D平面上的任何地方相交,因此需要进一步完善。显然,该代码可以快速丢弃窗口尺寸之外出现的任何交集。

一旦确定了“无限平面”碰撞点(这是相当快的确定),则可以确定更细粒度的交点。使用Bresenham's algorithm枚举相交线上的所有点,并将它们与基于正方形每一侧的1像素矩形进行比较。这将告诉您矩形的哪一侧相交。

如果只需要知道矩形是否被击中,则只需用pygame.Rect.collidepoint()检查直线中每个点的整个矩形即可。

enter image description here

当然,一旦生成了所有这些点,就很容易不必理会2D线的碰撞,但是对于较长的线,代码必须进行大量检查。因此,首先测试2D相交会真正加快它的速度。