Python 为什么alpha混合不能正常工作?

Python 为什么alpha混合不能正常工作?,python,pygame,blending,Python,Pygame,Blending,我正在尝试制作一个简单的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(

我正在尝试制作一个简单的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
import pygame,sys,time
从pygame.locals导入*
#定义常数
窗宽=600
窗户高度=600
FPS=60
pygame.init()
clock=pygame.time.clock()
screen=pygame.display.set_模式((窗口宽度、窗口高度),0,32)
α=0
递增=真
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
#用红色填充屏幕
屏幕填充(pygame.Color(247、25、0255))
alpha_surface=pygame.surface((screen.get_rect().width,screen.get_rect().height))
alpha_surface=alpha_surface.convert_alpha()
surface直立=alpha_surface.get_rect()
#用橙色填充表面
pygame.draw.rect(阿尔法曲面,(247137,0255,0480480))
#用半透明的黄色填充表面
pygame.draw.rect(alpha_曲面,(220247,0,alpha),(120120360))
#用绿色填充表面
pygame.draw.rect(alpha_曲面,(0247,4),(240240240240))
#用半透明的蓝色填充表面
pygame.draw.rect(alpha_曲面,(0,78,247,alpha),(360,360,120,120))
屏幕布利特(阿尔法曲面(120120))
pygame.display.update()
时钟滴答声(FPS)
如果增加:
α+=1
如果alpha>255:
α=255
增加=错误
其他:
α-=1
如果α<0:
α=0
递增=真
代码应该使黄色矩形与橙色矩形混合,蓝色矩形与绿色矩形混合。相反,我从中得到了一些东西:

图1:原始状态,黄色和蓝色不透明度设置为0%

为此:

图2:最终状态,黄色和蓝色不透明度设置为100%


正如你所看到的,黄色和蓝色矩形不仅与红色矩形(屏幕表面)混合,而且还与橙色和绿色矩形形成一个洞,这样我们可以通过它们看到红色矩形。

如果你想混合不同的层,那么你必须创建不同的s或图像。可以通过加载图像()或构造对象来生成曲面

使用每像素alpha创建一个完全透明的曲面。用于更改图像的像素格式,包括每像素字母。用透明颜色填充表面(例如
pygame.color(0,0,0,0)
):


最简单的例子:

导入pygame
pygame.init()
clock=pygame.time.clock()
screen=pygame.display.set_模式((600600),0,32)
def透明表面(尺寸):
surface=pygame.surface(大小).convert_alpha()
表面填充((0,0,0,0))
返回面
α,增加=0,1
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
屏幕填充(pygame.Color(247、25、0255))
alpha_surface1=透明曲面(screen.get_size())
pygame.draw.rect(alpha_surface1,(247137,0255),(120120480480))
alpha_surface2=透明曲面(screen.get_size())
pygame.draw.rect(alpha_surface2,(220,247,0,alpha),(240,240,360,360))
alpha_surface3=透明曲面(screen.get_size())
pygame.draw.rect(alpha_surface3,(0247,4),(360360240240))
alpha_surface4=透明曲面(screen.get_size())
pygame.draw.rect(alpha_surface4,(0,78,247,alpha),(480,480,120,120))
屏幕布利特(alpha_表面1,(0,0))
屏幕布利特(阿尔法表面2,(0,0))
屏幕布利特(阿尔法表面3,(0,0))
屏幕布利特(阿尔法表面4,(0,0))
pygame.display.update()
α+=增加
如果alpha<0或alpha>255:
增加*=-1
alpha=最大值(0,最小值(255,alpha))
pygame.quit()

当然,黄色矩形是在
alpha_曲面上绘制的,没有任何混合。它将覆盖
alpha_曲面中的区域
。并且不会与
alpha_曲面的内容进行任何混合。最后,将
alpha_曲面
混合到
屏幕
。因此,黄色矩形与屏幕的背景颜色“混合”。@rabbi76好的,但如何在绘图函数上应用混合(在本例中为
pygame.draw.rect()
)?这里是
pygame.draw.rect()
definition:
rect(Surface,color,rect,width=0)
,因为您可以看到没有混合标志参数。