如何在 Pygame 中为矩形添加颜色渐变?
How to add color gradient to rectangle in Pygame?
信息: 我正在使用 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?
来做到这一点
下面是使用 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()
信息: 我正在使用 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?
下面是使用 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()