我目前正在使用pygame用python创建游戏,而我的AI目前正通过墙壁“看到”我的角色并射击,但是AI不应射击。所以我的问题是:如何预防?我想到了一条线碰撞,该线从我的AI到我的角色,如果这条线撞到墙,则该AI不会射击。 任何帮助将不胜感激,非常感谢!
答案 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()
检查直线中每个点的整个矩形即可。
当然,一旦生成了所有这些点,就很容易不必理会2D线的碰撞,但是对于较长的线,代码必须进行大量检查。因此,首先测试2D相交会真正加快它的速度。