将pygame曲面设置为具有圆角

问题描述

这个class LauncherActivity : Branch.BranchReferralInitListener { override fun onStart() { super.onStart() Branch.sessionBuilder(this).withCallback(this).withData(parseIntent().data).init() if (BuildConfig.DEBUG) { IntegrationValidator.validate(this) } } private fun parseIntent(): Intent { var newIntent = Intent() newIntent = newIntent.putExtra("branch_force_new_session",true) newIntent = newIntent.putExtra("branch",intent.dataString) return newIntent } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) this.intent = intent Branch.sessionBuilder(this).withCallback(this).withData(parseIntent().data).reInit() } override fun onInitFinished(referringParams: JSONObject?,error: BranchError?) { if (error != null) { // Getting error only when app is not backgrounded } else if (referringParams != null) { // When app is backgrounded,it works } } } 类来自pygame.sprite。我想使用Rectangle来修改矩形的圆角。例如https://imgur.com/2N5NHlg

set_rounded

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来实现所需的目标。

创建一个与图像大小相同且矩形像素为(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,*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),None,pg.BLEND_RGBA_MIN) 

请注意,关键字属性border_radius是一项新功能。您必须使用最新的pygame版本(2.0.0.dev10)。

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

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,border_radius=roundness)

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

        self.image = self.original_image.copy().convert_alpha()
        self.image.blit(self.rect_image,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))
        self.image = self.original_image
        self.rect = self.image.get_rect()

    def set_rounded(self,pg.SRCALPHA)
        pg.draw.rect(self.rect_image,border_radius=roundness)

        self.image = self.original_image.copy().convert_alpha()
        self.image.blit(self.rect_image,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()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...