python-3.x Pygame中更复杂的颜色渐变

qv7cva1a  于 2023-04-22  发布在  Python
关注(0)|答案(2)|浏览(180)

在Python 3.8中使用Pygame模块:
我正在尝试为我正在制作的一个颜色游戏制作颜色渐变。我知道如何制作一维渐变,像这样:

但我希望能够创建一个图像与两个以上的颜色内的梯度。一个例子,从互联网上是这样的:(忽略花哨的文字)

如何创建一个函数来在曲面上生成多种颜色的渐变?重要的是,我可以选择角上的颜色,或者至少能够以我可以理解的方式影响它们。
我在网上发现的一个想法是这样的:

for i in range(900):
   for j in range(900):
      surface.set_at((i,j),(i/4,j/4,i/4))

我的问题是很难选择它生成的颜色,我不能拼凑如何使颜色相互融合,特别是有多个颜色。

9lowa7mx

9lowa7mx1#

Pygame没有渐变的API,虽然你没有发布自己的代码,但你可能做得很好。
因此,对于“2维平方梯度”,你必须继续将问题分解为更小的部分,直到你得到你想要的-对于这个,它可能是:在你感兴趣的区域的顶部y == 0处有一个渐变,在你感兴趣的区域的底部y =高度处有另一个渐变,对于每一列,你插入一个新的渐变,从顶部渐变的颜色开始,一直到底部渐变的颜色。
唯一的坏消息是,这在pygame中会非常慢-但您可以绘制一次并保存生成的图像,然后在游戏时加载它。
还有其他适合绘制 * 线性 * 渐变的库和框架,并且可以快速完成,如Cairo,GEGL和OpenGL本身-但这些都没有现成的方法将一个完整的渐变过渡到另一个。
[继续...]

nfeuvbwi

nfeuvbwi2#

因此,对于“2维平方梯度”,你必须继续将问题分解为更小的部分,直到你得到你想要的-对于这个,它可能是:在你感兴趣的区域的顶部y = 0处有一个渐变,在你感兴趣的区域的底部y =高度处有另一个渐变,对于每一列,你插入一个新的渐变,从顶部渐变的颜色开始,一直到底部渐变的颜色。
这很好用!我能够想出三个函数,它们一起创建了非常棒的4色矩形渐变,每种颜色都在不同的角落。如果你想使用它,这里是我的代码:

windowSurface = pygame.display.set_mode((1500,900))
s = pygame.Surface(size, pygame.SRCALPHA)
gradientStorage = pygame.Surface((1500,1500))
colorGridStorage = pygame. Surface((1500,1500))

def colorMix(color1, color2, paletteSize):    # creates a list of colors that gradually fade from color1 to color2, inclusive. paletteSize is the amount of values that will be generated.
               # The smallest useful paletteSize is 3, as it will return [color1, color1MixedWithColor2, color2]
        palette = [color1]
        colorDifference = [ color1[0] - color2[0], color1[1] - color2[1], color1[2] - color2[2] ]

        Rstep = (color1[0] - color2[0]) / (paletteSize -1)
        Gstep = (color1[1] - color2[1]) / (paletteSize -1)
        Bstep = (color1[2] - color2[2]) / (paletteSize -1)

        for i in range(1,paletteSize):
            palette.append((color1[0] - Rstep*i, color1[1] - Gstep*i, color1[2] - Bstep*i))

        palette.append(color2)

        return palette

def createColorGrid(resolution, color1, color2, color3, color4):        # build a new colorGrid using a different process than above. colors are RGB format. For a 1D color fade set pairs of colors
                                      # like (255,0,0) (255,0,0) (0,255,255) (0,255,255). Colors are ordered from top left corner and follow corners clockwise.
        colorArray = [resolution]   # the first value in colorGrid is always a tuple stating the resolution.
        leftColumn = colorMix(color1,color4,resolution[1])
        rightColumn = colorMix(color2,color3,resolution[1])

        for i in range(0,resolution[1]):                                                                  # color processing goes from top left to top right, then down a row and repeat
                colorArray.append(colorMix(leftColumn[i],rightColumn[i],resolution[0]))
        return colorArray

def drawColorGrid(colorGrid, rect):    # input a colorGrid array. This will draw the set of color tiles decided by the colorGrid you pass into it
    colorGridStorage.fill((255,255,255))
    iCounter = 0
    for i in colorGrid:

        jCounter = 0
        if isinstance(i[0], int):   # the first value in colorGrid is the [x,y] resolution. we need to ignore it and move on to the rest
            continue

        for j in i:
            rectX = (rect[0] + round( jCounter * (rect[2]/colorGrid[0][0])))
            rectY = rect[1] + round(iCounter * rect[3]/colorGrid[0][1])
            rectWidth = round(rect[2]/colorGrid[0][0])
            rectHeight = round(rect[3]/colorGrid[0][1])
            pygame.draw.rect(colorGridStorage, j, (rectX,  rectY, rectWidth, rectHeight))
            jCounter += 1
        iCounter +=1
    windowSurface.blit(colorGridStorage, (rect[0], rect[1]))

要绘制新的渐变,首先使用createColorGrid(resolution,color 1,color 2,color 3,color 4)来构建特定分辨率的颜色块数组。低分辨率看起来就像游戏I Love Hue中的东西。一旦有了colorGrid变量,将其插入drawColorGrid(colorGrid,rect)。这将获取colorGrid数组并将其blit到给定rect内的屏幕上。在本例中,屏幕表面名为windowSurface。
我是一个相当新的程序员,所以上面的代码中肯定有一些优化。如果你愿意,可以指出来给我看,但这段代码对我正在做的应用程序来说非常好。它似乎足够流畅,每秒可以生成并blit至少20个随机渐变到全屏,这比我需要的要多得多。

相关问题