python - 将 pygame 表面设置为圆角

标签 python pygame sprite blending

这个 Rectangle 类扩展自 pygame.sprite。我想使用 set_rounded 来修改矩形的角的圆度。例如/image/uyKWC.jpg

class Rectangle(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.original_image = pg.Surface((10, 10))
        self.image = self.original_image
        self.rect = self.image.get_rect()


    def set_rounded(self, roundness):
        pass

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

最佳答案

您可以通过设置函数 pygame.draw.rect 的关键字参数 border_radius 来实现您想要的效果.

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

size = self.original_image.get_size()
self.rect_image = pg.Surface(size, pg.SRCALPHA)
pg.draw.rect(self.rect_image, (255, 255, 255), (0, 0, *size), border_radius=roundness)

复制原始图像并使用 BLEND_RGBA_MIN 混合模式将矩形与图像混合(请参阅 pygame.Surface.blit ):

self.image = self.original_image.copy().convert_alpha()
self.image.blit(self.rect_image, (0, 0), None, pg.BLEND_RGBA_MIN) 

注意,关键字属性border_radius是Pygame 2.0中的新功能。


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

class Rectangle(pg.sprite.Sprite):
    # [...]

    def set_rounded(self, roundness):
        size = self.original_image.get_size()
        self.rect_image = pg.Surface(size, pg.SRCALPHA)
        
        #pg.draw.rect(self.rect_image, (255, 255, 255), (0, 0, *size), border_radius=roundness)

        r, c = roundness, (255, 255, 255)
        pg.draw.rect(self.rect_image, c, (r, 0, size[0]-2*r, size[1]))
        pg.draw.rect(self.rect_image, c, (0, r, size[0], size[1]-2*r))
        for cpt in [(r, r), (size[0]-r, r), (r, size[1]-r), (size[0]-r, size[1]-r)]:  
            pg.draw.circle(self.rect_image, c, cpt, r)

        self.image = self.original_image.copy().convert_alpha()
        self.image.blit(self.rect_image, (0, 0), None, pg.BLEND_RGBA_MIN) 

参见示例:

import pygame as pg

class Rectangle(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.original_image = pg.Surface((100, 100))
        self.original_image.fill((255, 0, 0))
        self.image = self.original_image
        self.rect = self.image.get_rect()

    def set_rounded(self, roundness):
        size = self.original_image.get_size()
        self.rect_image = pg.Surface(size, pg.SRCALPHA)
        pg.draw.rect(self.rect_image, (255, 255, 255), (0, 0, *size), border_radius=roundness)

        self.image = self.original_image.copy().convert_alpha()
        self.image.blit(self.rect_image, (0, 0), None, pg.BLEND_RGBA_MIN) 

pg.init()
window = pg.display.set_mode((200, 200))

rect_object = Rectangle()
rect_object.set_rounded(30)
rect_object.rect.center = window.get_rect().center
group = pg.sprite.Group(rect_object)

run = True
while run:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False

    window.fill((128, 128, 128))
    group.draw(window)
    pg.display.flip()

关于python - 将 pygame 表面设置为圆角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63700231/

相关文章:

java - Sprite 动画计时java swing

python - 'docker' 未被识别为内部或外部命令

python - 带有 imshow 的 matplotlib 图的 x 轴日期

python - 当 pygame Sprite 遇到尾部时,如何检测并结束游戏(使用 screen.get_at)?

python pygame 检查碰撞然后使项目返回到原始站点

javascript - Three.js 中的初始 Sprite 大小

python - scikit-learn PCA 转换返回不正确的缩减特征长度

python - 我可以通过使用循环使迭代变得更容易吗?

python - Pygame 没有在窗口中显示任何内容

android - OpenGL/Android 大 Sprite 四边形表现不佳