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

Flo*_*loW 6 python pygame

我目前正在用 pygame 用 python 创建一个游戏,我的人工智能目前正在透过墙壁“看到”我的角色并向它射击,但人工智能不应该射击。所以我的问题是:如何防止这种情况发生?我考虑过线碰撞,其中线从我的 AI 到我的角色,如果这条线碰撞墙壁,那么这个 AI 不会射击。任何帮助将不胜感激,非常感谢!

Kin*_*ley 3

这是一个很好的问题!

\n\n

你的矩形可以被认为是 4 条线:

\n\n
(x, y)        \xe2\x86\x92 (x+width, y)        # top\n(x+width, y)  \xe2\x86\x92 (x+width, y+height) # right\n(x, y+height) \xe2\x86\x92 (x+width, y+height) # bottom\n(x, y)        \xe2\x86\x92 (x, y+height)       # left \n
Run Code Online (Sandbox Code Playgroud)\n\n

考虑相交线,可以使用两条线相交公式来确定这些线是否相交(但要小心平行线!)

\n\n

然而,公式(在链接的维基百科文章中指定)确定线是否在 2D 平面上的任何位置相交,因此需要进一步细化。显然,代码可以快速丢弃窗口尺寸之外发生的任何交叉点。

\n\n

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

\n\n

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

\n\n

在此输入图像描述

\n\n

当然,一旦生成了所有这些点,就很容易不用担心 2D 线碰撞,但对于长线,代码必须进行大量检查。因此,首先测试二维交叉确实可以加快速度。

\n