<p>与其创建一大堆<code>rect</code>对象来测试碰撞,我建议创建一个<code>mask</code>的可碰撞对象,并测试碰撞。基本上,<code>mask</code>是在图像中使用哪些像素和哪些像素不在图像中的映射。你几乎可以把它想象成一个表面的阴影或轮廓。你知道吗</p>
<p>当您调用<code>pygame.draw.circle</code>时,您已经通过了一个曲面。现在你直接在屏幕上画图,这对我的建议可能没有多大用处。我建议创建一个<code>rect</code>覆盖所绘制线的整个区域,然后创建一个该大小的曲面,然后将线绘制到此曲面。我的代码将假设您已经知道线的点的边界。你知道吗</p>
<pre><code>line_rect = pygame.Rect(leftmost, topmost, rightmost - leftmost, bottommost - topmost)
line_surf = pygame.Surface((line_rect.width, line_rect.height))
</code></pre>
<p>在<code>drawGradientLine</code>函数中,必须将点坐标转换为<code>line_surf</code>的对象空间。你知道吗</p>
<pre><code>while (i < len(pointList)-1):
drawGradientLine(line_surf, (line_rect.x, line_rect.y), i, pointList[i], pointList[i+1], r, mode)
i += 1
def drawGradientLine(surf, offset, index, start, end, width, color_mode):
# the code leading up to where you draw the circle...
for i in xrange(dist):
x = int(start[0]+float(i)/dist*dx) - offset[0]
y = int(start[1]+float(i)/dist*dy) - offset[1]
pygame.draw.circle(surf, color, (x, y), width)
</code></pre>
<p>现在,您将有一个曲面,其中绘制的对象将被快速加载到该曲面上。请注意,如果要绘制的线的宽度大于1,则在创建曲面时可能需要向曲面添加一些填充。你知道吗</p>
<p>既然已经有了曲面,就需要创建它的<code>mask</code>。你知道吗</p>
<pre><code>surf_mask = pygame.mask.from_surface(line_surf)
</code></pre>
<p>希望这对你来说不会太复杂!现在,您可以检查掩码中的每个“活动”点是否在播放器的<code>rect</code>内发生碰撞(或在平台中绘制的任何其他要碰撞的对象),也可以从此类播放器对象的表面创建掩码,并使用<code>pygame.Mask.overlap_area</code>函数检查像素完美碰撞。你知道吗</p>
<pre><code># player_surf is a surface object I am imagining exists
# player_rect is a rect object I am imagining exists
overlap_count = surf_mask.overlap_area(player_surf, (line_rect.x - player_rect.x, line_rect.y - player_rect.y))
</code></pre>
<p><code>overlap_count</code>应该是掩码之间重叠的像素数的计数。如果这大于零,那么你就知道发生了碰撞。你知道吗</p>
<p>以下是<code>pygame.Mask.overlap_area</code>:<a href="http://www.pygame.org/docs/ref/mask.html#pygame.mask.Mask.overlap_area" rel="nofollow">http://www.pygame.org/docs/ref/mask.html#pygame.mask.Mask.overlap_area</a>的文档</p>