创建一个透明表面以在 pygame 中绘制像素
creating a transparent surface to draw pixels to in pygame
我创建了一个表面,我使用像素阵列在上面放置像素,但我想让表面透明但让像素不透明,我试过让表面透明然后绘制像素他表面但这只是使像素也透明,任何帮助或我错过了什么?
-编辑- 希望这会在某种程度上有所帮助,这是创建星系表面的 class 对象
我也说了我的尝试,没有更多要说的了
class Galaxy(object):
def __init__(self,posx=0,posy=0,radius=0,depth=0):
radius = int(radius)
self.size = [radius*2,radius*2,depth]
self.posx = posx
self.posy = posy
self.radius = radius
#create array for stars
self.starArray = []
#create surface for stars
self.surface = pygame.Surface([radius*2,radius*2])
self.starPixel = pygame.PixelArray(self.surface)
#populate
for x in range(radius*2):
for y in range(radius*2):
#generate stars
num1 = noise.snoise2(x+posx,y+posy,repeatx=radius*10,repeaty=radius*10)
distance = math.sqrt(math.pow((x-radius),2)+math.pow((y-radius),2))
if distance < 0:
distance = distance * -1
#print(x,y,"is",distance,"from",radius,radius)
val = 5
#glaxy density algorithm
num = (num1 / ( ((distance+0.0001)/radius)*(val*10) )) * 10
#density
if num > (1/val):
#create star
self.starArray.append(Stars(x,y,seed=num1*100000,distance=distance))
#print(num*1000)
self.addPixels()
#adds all star pixels to pixel array on surface
def addPixels(self):
for i in self.starArray:
self.starPixel[i.x,i.y] = i.colour
del self.starPixel
#sends to screen to await rendering
def display(self):
screen.displaySurface(self.surface,[self.posx+camPosX,self.posy+camPosY])
使用 MyGalaxy.set_colorkey(SomeUnusedRGB)
定义零 alpha(不可见)背景色,用该颜色填充 MyGalaxy
,然后在其上绘制像素。您 可以 使用 pixelArray
函数绘制到该表面,但出于可管理性和性能的原因,您最好使用 MyGalaxy.set_at(pixelLocationXY, pixelColourRGB)
代替。
确保 SomeUnusedRGB
永远不会与任何 pixelColourRGB
相同,否则这些像素将不会出现(因为 pygame 会将它们解释为不可见)。当你 blit MyGalaxy 到你想要的任何地方时,它应该只 blit 非 SomeUnusedRGB 颜色的像素,其余的保持不变。
(这是我在不了解您的代码的情况下所能提供的最好的结果;修改问题以包括您已经在尝试的内容,我将更新此答案。)
我创建了一个表面,我使用像素阵列在上面放置像素,但我想让表面透明但让像素不透明,我试过让表面透明然后绘制像素他表面但这只是使像素也透明,任何帮助或我错过了什么?
-编辑- 希望这会在某种程度上有所帮助,这是创建星系表面的 class 对象
我也说了我的尝试,没有更多要说的了
class Galaxy(object):
def __init__(self,posx=0,posy=0,radius=0,depth=0):
radius = int(radius)
self.size = [radius*2,radius*2,depth]
self.posx = posx
self.posy = posy
self.radius = radius
#create array for stars
self.starArray = []
#create surface for stars
self.surface = pygame.Surface([radius*2,radius*2])
self.starPixel = pygame.PixelArray(self.surface)
#populate
for x in range(radius*2):
for y in range(radius*2):
#generate stars
num1 = noise.snoise2(x+posx,y+posy,repeatx=radius*10,repeaty=radius*10)
distance = math.sqrt(math.pow((x-radius),2)+math.pow((y-radius),2))
if distance < 0:
distance = distance * -1
#print(x,y,"is",distance,"from",radius,radius)
val = 5
#glaxy density algorithm
num = (num1 / ( ((distance+0.0001)/radius)*(val*10) )) * 10
#density
if num > (1/val):
#create star
self.starArray.append(Stars(x,y,seed=num1*100000,distance=distance))
#print(num*1000)
self.addPixels()
#adds all star pixels to pixel array on surface
def addPixels(self):
for i in self.starArray:
self.starPixel[i.x,i.y] = i.colour
del self.starPixel
#sends to screen to await rendering
def display(self):
screen.displaySurface(self.surface,[self.posx+camPosX,self.posy+camPosY])
使用 MyGalaxy.set_colorkey(SomeUnusedRGB)
定义零 alpha(不可见)背景色,用该颜色填充 MyGalaxy
,然后在其上绘制像素。您 可以 使用 pixelArray
函数绘制到该表面,但出于可管理性和性能的原因,您最好使用 MyGalaxy.set_at(pixelLocationXY, pixelColourRGB)
代替。
确保 SomeUnusedRGB
永远不会与任何 pixelColourRGB
相同,否则这些像素将不会出现(因为 pygame 会将它们解释为不可见)。当你 blit MyGalaxy 到你想要的任何地方时,它应该只 blit 非 SomeUnusedRGB 颜色的像素,其余的保持不变。
(这是我在不了解您的代码的情况下所能提供的最好的结果;修改问题以包括您已经在尝试的内容,我将更新此答案。)