我正在尝试创建一个简单的Pyame应用程序,其中将一些颜色与它们下面的颜色混合。这是我的代码:
代码列表1:
import pygame, sys, time
from pygame.locals import *
#define constants
WINDOW_WIDTH = 600
WINDOW_HEIGHT = 600
FPS = 60
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT), 0, 32)
alpha = 0
increasing = True
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#fill screen with red
screen.fill(pygame.Color(247, 25, 0,255))
alpha_surface = pygame.Surface((screen.get_rect().width, screen.get_rect().height))
alpha_surface = alpha_surface.convert_alpha()
surfaceRect = alpha_surface.get_rect()
#fill surface with orange
pygame.draw.rect(alpha_surface, (247, 137, 0, 255), (0, 0, 480, 480))
#fill surface with translucent yellow
pygame.draw.rect(alpha_surface, (220, 247, 0, alpha), (120, 120, 360, 360))
#fill surface with green
pygame.draw.rect(alpha_surface, (0, 247, 4), (240, 240, 240, 240))
#fill surface with translucent blue
pygame.draw.rect(alpha_surface, (0, 78, 247, alpha), (360, 360, 120, 120))
screen.blit(alpha_surface, (120,120))
pygame.display.update()
clock.tick(FPS)
if increasing:
alpha += 1
if alpha > 255:
alpha = 255
increasing = False
else:
alpha -= 1
if alpha < 0:
alpha = 0
increasing = True
该代码应该可以使黄色矩形与橙色矩形融合在一起,而蓝色矩形与绿色矩形融合在一起。相反,我从中得到了一些东西:
图1:原始状态,黄色和蓝色不透明度设置为0%
Here is the extended information
对此:
如您所见,黄色和蓝色矩形不仅与红色矩形(屏幕表面)融合在一起,而且还在橙色和绿色矩形上打了一个洞,以便我们可以通过它们看到红色矩形。
答案 0 :(得分:2)
如果要混合不同的图层,则必须创建不同的pygame.Surface
或图像。请注意pygame.image
生成曲面。
创建一个表面并使其完全透明。此测量用pygame.Color(0, 0, 0, 0)
填充:
alpha_surface1 = pygame.Surface( (screen.get_rect().width, screen.get_rect().height) )
alpha_surface1 = alpha_surface1.convert_alpha()
alpha_surface1.fill( pygame.Color(0, 0, 0, 0) )
在所需的表面上绘制任何东西,例如矩形
pygame.draw.rect(alpha_surface1, (247, 137, 0, 255), (120, 120, 480, 480))
blit()
屏幕上的表面:
screen.blit(alpha_surface1, (0,0))
在多个表面重复此操作
例如
#fill screen with red
screen.fill(pygame.Color(247, 25, 0,255))
#fill surface with orange
alpha_surface1 = pygame.Surface( (screen.get_rect().width, screen.get_rect().height) )
alpha_surface1 = alpha_surface1.convert_alpha()
alpha_surface1.fill( pygame.Color(0, 0, 0, 0) )
pygame.draw.rect(alpha_surface1, (247, 137, 0, 255), (120, 120, 480, 480))
#fill surface 2 with translucent yellow
alpha_surface2 = pygame.Surface( (screen.get_rect().width, screen.get_rect().height) )
alpha_surface2 = alpha_surface2.convert_alpha()
alpha_surface2.fill( pygame.Color(0, 0, 0, 0) )
pygame.draw.rect(alpha_surface2, (220, 247, 0, alpha), (240, 240, 360, 360))
#fill surface 3 with green
alpha_surface3 = pygame.Surface( (screen.get_rect().width, screen.get_rect().height) )
alpha_surface3 = alpha_surface3.convert_alpha()
alpha_surface3.fill( pygame.Color(0, 0, 0, 0) )
pygame.draw.rect(alpha_surface3, (0, 247, 4), (360, 360, 240, 240) )
#fill surface 4 with translucent blue
alpha_surface4 = pygame.Surface( (screen.get_rect().width, screen.get_rect().height) )
alpha_surface4 = alpha_surface4.convert_alpha()
alpha_surface4.fill( pygame.Color(0, 0, 0, 0) )
pygame.draw.rect(alpha_surface4, (0, 78, 247, alpha), (480, 480, 120, 120) )
# blend surface1 on screen
screen.blit(alpha_surface1, (0,0))
# blend surface2 on screen
screen.blit(alpha_surface2, (0,0))
# blend surface3 on screen
screen.blit(alpha_surface3, (0,0))
# blend surface4 on screen
screen.blit(alpha_surface4, (0,0))