import pygame
class RoundedRect:
def __init__(self, rect, outer_color, inner_color, linewidth = 2, radius = 0.4):
self.rect = pygame.Rect(rect)
self.outer_color = pygame.Color(*outer_color)
self.inner_color = pygame.Color(*inner_color)
self.linewidth = linewidth
self.radius = radius
def surface(self):
rectangle = self.filledRoundedRect(self.rect, self.outer_color, self.radius)
inner_rect = pygame.Rect((
self.rect.left + 2 * self.linewidth,
self.rect.top + 2 * self.linewidth,
self.rect.right - 2 * self.linewidth,
self.rect.bottom - 2 * self.linewidth
))
inner_rectangle = self.filledRoundedRect(inner_rect, self.inner_color, self.radius)
rectangle.blit(inner_rectangle, (self.linewidth, self.linewidth))
return rectangle
def filledRoundedRect(self, rect, color, radius=0.4):
"""
filledRoundedRect(rect,color,radius=0.4)
rect : rectangle
color : rgb or rgba
radius : 0 <= radius <= 1
"""
alpha = color.a
color.a = 0
pos = rect.topleft
rect.topleft = 0,0
rectangle = pygame.Surface(rect.size,pygame.SRCALPHA)
circle = pygame.Surface([min(rect.size)*3]*2,pygame.SRCALPHA)
pygame.draw.ellipse(circle,(0,0,0),circle.get_rect(),0)
circle = pygame.transform.smoothscale(circle,[int(min(rect.size)*radius)]*2)
radius = rectangle.blit(circle,(0,0))
radius.bottomright = rect.bottomright
rectangle.blit(circle,radius)
radius.topright = rect.topright
rectangle.blit(circle,radius)
radius.bottomleft = rect.bottomleft
rectangle.blit(circle,radius)
rectangle.fill((0,0,0),rect.inflate(-radius.w,0))
rectangle.fill((0,0,0),rect.inflate(0,-radius.h))
rectangle.fill(color,special_flags=pygame.BLEND_RGBA_MAX)
rectangle.fill((255,255,255,alpha),special_flags=pygame.BLEND_RGBA_MIN)
return rectangle