防止不透明度随创建的每个新对象而倍增

Prevent Opacity from multiplying with every new objects created

我有这个 class 调用透明度函数在我的外圆后面创建一个透明的内圆,问题是这个圆的不透明度与创建的每个对象相乘导致了这个问题:

这不是我想要的,我对如何在每个循环中只调用一次这个函数没有太多想法,我之前尝试将函数调用放在 init def 本身中,但它没有我不记得它做了我想做的事。

最后,所有圆圈应该看起来像

这是我的 class 和称为透明度的不透明度函数(我知道它应该称为不透明度而不是我只是 pepega),以及我通过另一个文件调用 class 的函数

import pygame

def transparency(self,surface, inner_surface, size, x, y):
        self.circle = pygame.draw.circle(inner_surface, (255, 255, 255, 10), (x,y), int(size[0]/2)-5)
        surface.blit(inner_surface, (0,0))
        surface.blit(self.image,(x-((size[0])/2),y-((size[1])/2)))

class circles(pygame.sprite.Sprite): # Initalise a new circle with set position and size (defined by cs)

    def __init__(self,surface, inner_surface, x, y, cs, font):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("./assets/circle.png").convert_alpha()
        size = (int(round(2.25*(109-(9*cs)))),int(round(2.25*(109-(9*cs)))))
        self.image = pygame.transform.scale(self.image, size)
        transparency(self, surface, inner_surface, size, x, y)
        pygame.display.update()

def Place_circles(screen, curve, circle_space, font):
    inner = inner_init([GetSystemMetrics(0), GetSystemMetrics(1)])
    Circle_list = []
    idx = [0,0]
    for c in reversed(range(0,len(curve))):
        for p in reversed(range(0,len(curve[c]))):
            dist = math.sqrt(math.pow(curve[c][p][0] - curve[idx[0]][idx[1]][0],2)+math.pow(curve [c][p][1] - curve[idx[0]][idx[1]][1],2))
            if dist > circle_space:
                print(dist)
                print(idx)
                idx = [c,p]
                Circle_list.append(circles.circles(screen, inner, curve[c][p][0], curve[c][p][1], 4, font))

进口pygame

def 透明度(自身,表面,inner_surface,大小,x,y): self.circle = pygame.draw.circle(inner_surface, (255, 255, 255, 10), (x,y), int(大小[0]/2)-5) surface.blit(inner_surface, (0,0)) surface.blit(self.image,(x-((size[0])/2),y-((size[1])/2)))

inner_surface与屏幕大小相同。所有透明圆都绘制在 inner_surface 上。每次您 blitinner_surface 放到屏幕上时,在 inner_surface 上绘制的任何圆圈都会变得更加不透明。您根本不需要 inner_surface。创建一个临时 Surface。在临时 Surface 上画圆,blit 在屏幕上画圆:

def transparency(self,surface, size, x, y):
    temp_surface = pygame.Surface(size, pygame.SRCALPHA)
    self.circle = pygame.draw.circle(temp_surface, (255, 255, 255, 10), (size[0]//2, size[1]//2), int(size[0]/2)-5)
    topleft = x - size[0] // 2, y - size[1] // 2
    surface.blit(inner_surface, topleft)
    surface.blit(self.image, topleft)

另见 Draw a transparent rectangle in pygame
.