python 如何在pygame中从图片中剪切一个圆(或任何非矩形)?

nhhxz33t  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(202)

我正在使用Pygame,有一个图片,我可以从中剪切一个矩形:

image = pygame.transform.scale(pygame.image.load('example.png'), (32, 32))
handle_surface = image.copy()
handle_surface.set_clip(pygame.Rect(0, 0, 32, 16))
clipped_image = surface.subsurface(handle_surface.get_clip())

我尝试通过传递Surface来使用subsurface

handle_surface = image.copy()
hole = pygame.Surface((32, 32))
pygame.draw.circle(hole, (255, 255, 255), (0, 0), 32)
handle_surface.set_clip(hole)
image = surface.subsurface(handle_surface.get_clip())
surf = image.copy()

但我得到的错误:

ValueError: invalid rectstyle object

出现此错误是因为subsurface的名称是Rect,而不是Surface。是否有方法从该图像中剪切另一个形状并使collidepoint正常工作?

1mrurvl1

1mrurvl11#

您不能使用pygame.Surface.subsurface,因为 Surface 始终是矩形,不能是圆形。pygame.Rect.collidepoint检测点是否在矩形区域内,因此也不能帮助您。
圆和点之间的碰撞检测可以使用指针和圆心之间的距离来计算。(dx*dx + dy*dy)。检查距离的平方是否小于半径的平方。在以下代码中,点的坐标为(pxpy),并且圆由其中心(cx, cy)和其半径(radius)限定。

dx = px - cx
dy = py - cy
if dx*dx + dy*dy <= radius*radius:
    print('hit')

另一种解决方案是PyGame与遮罩的碰撞,pygame.sprite.collide_circle也可以帮助解决问题,但你必须为半径为1的点创建一个pygame.sprite.Sprite对象,这似乎使问题过于复杂。
如果要从pygame.Surface剪裁圆形区域,请参见:

  • 如何在PyGame中生成圆形曲面
  • 如何在pygame中聚焦光线或者只画出窗口的某些圆形部分?
  • 如何在pygame中显示一个黑色的大矩形和一个可移动的透明圆圈?
  • 我可以在Pygame中的移动物体上使用图像而不是颜色吗?

简短说明:

  • 从图像中创建一个矩形的局部区域(仅当圆形没有填满整个图像时)。但是,图像必须有一个alpha通道。如果没有,可以使用convert_alpha来实现。
  • 使用图像大小创建透明(pygame.SRCALPHA)蒙版
  • 在蒙版上画一个白色不透明的圆圈(我在这里使用pygame.draw.ellipse,因为它更容易设置维度)
  • 使用混合模式pygame.BLEND_RGBA_MIN将圆形蒙版与图像混合。(参见pygame.Surface.blit
sub_image = image.subsurface(pygame.Rect(x, y, w, h)).convert_alpha()
mask_image = pygame.Surface(sub_image.get_size(), pygame.SRCALPHA)
pygame.draw.ellipse(mask_image, (255, 255, 255, 255), sub_image.get_rect())
sub_image.blit(mask_image, (0, 0), special_flags=pygame.BLEND_RGBA_MIN)

相关问题