Python 将pygame曲面设置为具有圆角

Python 将pygame曲面设置为具有圆角,python,pygame,sprite,blending,Python,Pygame,Sprite,Blending,这个Rectangle类扩展自pygame.sprite。我想使用set_rounded修改矩形角的圆角方式。比如说 类矩形(pg.sprite.sprite): 定义初始化(自): 精灵精灵。精灵。精灵初始(自我) self.original_image=pg.Surface((10,10)) self.image=self.original\u图像 self.rect=self.image.get_rect() def set_四舍五入(自身、圆度): 通过 roundness参数将确定圆

这个
Rectangle
类扩展自pygame.sprite。我想使用
set_rounded
修改矩形角的圆角方式。比如说

类矩形(pg.sprite.sprite):
定义初始化(自):
精灵精灵。精灵。精灵初始(自我)
self.original_image=pg.Surface((10,10))
self.image=self.original\u图像
self.rect=self.image.get_rect()
def set_四舍五入(自身、圆度):
通过

roundness
参数将确定圆角矩形的半径。

您可以通过设置函数的关键字argument
border\u radius
来实现所需

创建一个与图像大小和每像素alpha相同的矩形(
SRCALPHA
),并绘制一个带圆角的完全白色不透明图像:

size=self.original\u image.get\u size()
self.rect_image=pg.Surface(尺寸,pg.SRCALPHA)
pg.draw.rect(self.rect_图像,(255,255,255),(0,0,*大小),边框半径=圆度)
复制原始图像并使用
混合\u RGBA\u MIN
混合模式将矩形与图像混合(请参见):

self.image=self.original\u image.copy().convert\u alpha()
blit(self.rect_image,(0,0),None,pg.BLEND_RGBA_MIN)
注意,关键字属性
border\u radius
是一项新功能。您必须使用最新的pygame版本(2.0.0.dev10)。

如果无法使用版本2.0.0.dev10,则需要自己将圆角矩形粘在一起:

类矩形(pg.sprite.sprite):
# [...]
def set_四舍五入(自身、圆度):
size=self.original\u image.get\u size()
self.rect_image=pg.Surface(尺寸,pg.SRCALPHA)
#pg.draw.rect(self.rect_图像,(255,255,255),(0,0,*大小),边框半径=圆度)
r、 c=圆度,(255,255,255)
pg.draw.rect(self.rect_图像,c,(r,0,大小[0]-2*r,大小[1]))
pg.draw.rect(self.rect_图像,c,(0,r,大小[0],大小[1]-2*r))
对于[(r,r),(尺寸[0]-r,r),(r,尺寸[1]-r),(尺寸[0]-r,尺寸[1]-r)]中的cpt:
pg.draw.circle(自校正图像、c、cpt、r)
self.image=self.original\u image.copy().convert\u alpha()
blit(self.rect_image,(0,0),None,pg.BLEND_RGBA_MIN)

请参见示例:

将pygame导入为pg
类矩形(pg.sprite.sprite):
定义初始化(自):
精灵精灵。精灵。精灵初始(自我)
self.original_image=pg.Surface((100100))
self.original_image.fill((255,0,0))
self.image=self.original\u图像
self.rect=self.image.get_rect()
def set_四舍五入(自身、圆度):
size=self.original\u image.get\u size()
self.rect_image=pg.Surface(尺寸,pg.SRCALPHA)
pg.draw.rect(self.rect_图像,(255,255,255),(0,0,*大小),边框半径=圆度)
self.image=self.original\u image.copy().convert\u alpha()
blit(self.rect_image,(0,0),None,pg.BLEND_RGBA_MIN)
第init页()
窗口=pg.display.set_模式((200200))
rect_object=Rectangle()
矩形对象。设置圆形(30)
rect_object.rect.center=window.get_rect().center
组=pg.sprite.group(rect_对象)
运行=真
运行时:
对于pg.event.get()中的事件:
如果event.type==pg.QUIT:
运行=错误
窗口填充((128128128))
组图(窗口)
pg.display.flip()

此项目必须与pygame 1.9.6+兼容。有没有办法不用border_radius来实现这一点?@Hydra我扩展了答案。问题解决了吗?我请求编辑,因为矩形的宽度使用了错误的索引。另一个问题是圆角矩形的背景是黑色的,不是透明的。通过改变背景颜色可以看出这一点。@Rabbid76似乎仍然存在self.rect_图像表面的问题,出于某种原因,它仍然显示在rect后面。将窗口背景更改为window.fill((0,150,0))。我还没有找到解决这个问题的办法。我尝试设置alpha,改变它的可见性,但它仍然存在。你是对的,我的答案中有一个bug(初学者的错误)。我已经更正了答案:
self.image=self.original\u image.copy().convert\u alpha()