Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止不透明度与创建的每个新对象相乘_Python_Random_Pygame_Opacity_Polyline - Fatal编程技术网

Python 防止不透明度与创建的每个新对象相乘

Python 防止不透明度与创建的每个新对象相乘,python,random,pygame,opacity,polyline,Python,Random,Pygame,Opacity,Polyline,我有一个类,它调用一个透明度函数,在我的外圆后面创建一个透明的内圆,问题是这个圆的不透明度与创建的每个对象相乘,导致这个问题: 这不是我想要的,我也不知道如何在每个循环中只调用这个函数一次,我以前尝试过将函数调用放在init def中,但它不记得它做了我想要的事情 最后,所有的圆圈都应该是这样的 这是我的类和名为transparency的opacity函数(我知道它应该被称为opacity,而我只是pepega),以及通过另一个文件调用该类的函数 导入pygame def透明度(自身、表面、

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

这不是我想要的,我也不知道如何在每个循环中只调用这个函数一次,我以前尝试过将函数调用放在init def中,但它不记得它做了我想要的事情

最后,所有的圆圈都应该是这样的

这是我的类和名为transparency的opacity函数(我知道它应该被称为opacity,而我只是pepega),以及通过另一个文件调用该类的函数

导入pygame
def透明度(自身、表面、内表面、大小、x、y):
self.circle=pygame.draw.circle(内表面,(255,255,255,10),(x,y),int(大小[0]/2)-5)
表面。blit(内表面,(0,0))
blit(self.image,(x-((大小[0])/2),y-((大小[1])/2)))
类圆(pygame.sprite.sprite):#使用设置的位置和大小(由cs定义)初始化一个新圆
定义初始化(自、表面、内表面、x、y、cs、字体):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“./assets/circle.png”).convert_alpha()
大小=(整数(圆形(2.25*(109-(9*cs))),整数(圆形(2.25*(109-(9*cs)))))
self.image=pygame.transform.scale(self.image,size)
透明度(自身、曲面、内曲面、大小、x、y)
pygame.display.update()
def放置圆(屏幕、曲线、圆空间、字体):
内部=内部初始化([GetSystemMetrics(0),GetSystemMetrics(1)])
圈_列表=[]
idx=[0,0]
对于反向(范围(0,长度(曲线))中的c:
对于反向(范围(0,len(曲线[c]))中的p:
dist=math.sqrt(math.pow(曲线[c][p][0]-曲线[idx[0]][idx[1]][0],2)+math.pow(曲线[c][p][1]-曲线[idx[0]][idx[1][1],2))
如果距离>圆形空间:
打印(区)
打印(idx)
idx=[c,p]
圆列表.附加(圆.圆(屏幕,内部,曲线[c][p][0],曲线[c][p][1],4,字体))
导入pygame

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

内表面
与屏幕大小相同。所有透明圆都绘制在
内表面上
。每次
blit
在屏幕上显示
内表面
时,在
内表面
上绘制的任何圆都会变得更加不透明。您根本不需要
内表面
。创建一个临时曲面。在临时表面上绘制圆,并在屏幕上显示:

def透明度(自身、表面、大小、x、y):
temp_surface=pygame.surface(大小,pygame.SRCALPHA)
self.circle=pygame.draw.circle(临时曲面,(255,255,255,10),(大小[0]//2,大小[1]//2),int(大小[0]/2)-5)
topleft=x-size[0]//2,y-size[1]//2
表面。blit(内表面,左上角)
surface.blit(self.image,左上角)
另见

而且。

我明白了,这基本上相当于在我的for循环中移动放置这些圆的内曲面,但我想这项工作,我将重新编写我的整个代码,因为它使用25%的CPU,屏幕上什么都没有,总之这解决了我的问题issue@Gess1t不要在for循环内移动
内表面
。这将对性能造成影响<代码>内表面
有屏幕大小,但你只需要一个图像大小的表面。我忘了问,如果我试图删除一个圆,那会怎么样?这不会去除后面的像素吗?我对我的实施有些怀疑。而且,即使不移动我的内表面并删除所有与之相关的代码,我仍然有25%的CPU使用率,所以正如我所说的,我只是要返工所有内容。@Gess1t您无法从屏幕上删除对象。当你画一个对象时,它只会改变屏幕上的像素。如果要删除对象,则已重新绘制整个场景。通常的做法是在每一帧中重新绘制整个场景。