如何在Pygame中为矩形添加渐变色?

7

信息: 我正在使用pygame画一个矩形,但是想要在矩形上添加渐变效果,使其看起来像有阴影。

现在这是我的代码:

light_green = (0, 255, 0)
dark_green = (0, 100, 0)

pygame.draw.rect(screen, light_green, rect_dims) # Draws a rectangle without a gradient


问题:我想在不绘制一堆线条的情况下创建从浅绿色到深绿色之间的线性过渡(因为那很慢),那么我能否使用pygame来实现这个效果?


1
使用PIL模块(如果没有其他方法,您可以使用它来生成图像文件并使用它),您可以尝试以下操作:这里是如何做到的,您可能还可以将其适应于pygame。还有一种更通用的方法,描述了我在另一个答案中所涉及的数学知识。 - martineau
1
你也可以定义一个小位图,然后使用 smoothscale 来拉伸它到所需大小。这将创建一个渐变。 - Kingsley
你能给我一个例子吗? - user12128336
@Kingsley:这是一个非常好的建议!我以前在C++中使用过非常类似的技术,使用了一个库来缩放和转换图像文件(就像我相信pygame可以做到的那样)。 - martineau
2
Leon: smoothscale已经记录在案,并且在pygame文档中有使用它的示例。 - martineau
1个回答

5

这是一个使用smoothscale的快速测试。它开始于一个2x2的彩色位图,然后在绘制结果之前任意缩放。

虽然PyGame会利用可用的硬件来进行拉伸,但我不认为这样很快。

import pygame

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400

### initialisation
pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ) )
pygame.display.set_caption("Gradient Rect")

def gradientRect( window, left_colour, right_colour, target_rect ):
    """ Draw a horizontal-gradient filled rectangle covering <target_rect> """
    colour_rect = pygame.Surface( ( 2, 2 ) )                                   # tiny! 2x2 bitmap
    pygame.draw.line( colour_rect, left_colour,  ( 0,0 ), ( 0,1 ) )            # left colour line
    pygame.draw.line( colour_rect, right_colour, ( 1,0 ), ( 1,1 ) )            # right colour line
    colour_rect = pygame.transform.smoothscale( colour_rect, ( target_rect.width, target_rect.height ) )  # stretch!
    window.blit( colour_rect, target_rect )                                    # paint it


### Main Loop
clock = pygame.time.Clock()
finished = False
while not finished:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True

    # Update the window
    window.fill( ( 0,0,0 ) )
    gradientRect( window, (0, 255, 0), (0, 100, 0), pygame.Rect( 100,100, 100, 50 ) )
    gradientRect( window, (255, 255, 0), (0, 0, 255), pygame.Rect( 100,200, 128, 64 ) )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)

pygame.quit()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接