在pygame中,有没有一种方法可以在掩码内将某些内容绘制到屏幕上。例如:如果您有一个掩码,其中所有位都设置为1,除了左上角和完全黑色的图像,而不改变图像,您能保持左上角(与掩码相同)的清晰吗?只更新掩码(而不是矩形)也会有所帮助。
在pygame中,有没有一种方法可以在掩码内将某些内容绘制到屏幕上。例如:如果您有一个掩码,其中所有位都设置为1,除了左上角和完全黑色的图像,而不改变图像,您能保持左上角(与掩码相同)的清晰吗?只更新掩码(而不是矩形)也会有所帮助。
好的,如果我正确理解您的问题,诀窍在于BLEND_RGBA_MULT
标志。
我很好奇,所以决定亲自测试一下。 我从这张图片开始:
我制作了一张图像,在我想要显示图像的地方用白色,我想要遮罩的地方用透明度。 我甚至给它不同级别的透明度,看看能否得到模糊的遮罩效果。
^^^由于是白色透明背景,因此很难看到该图像。 您只需右键单击并下载即可。
我加载了这两个图像,确保使用了convert_alpha()
:
background = pygame.image.load("leaves.png").convert_alpha()
mask = pygame.image.load("mask-fuzzy.png").convert_alpha()
然后为了对图像进行遮罩,我复制了要被遮罩的图像。
masked = background.copy()
我使用BLEND_RGBA_MULT
将掩码复制到此副本上。
masked.blit(mask, (0, 0), None, pygame.BLEND_RGBA_MULT)
...然后我把它绘制到屏幕上。
display.blit(masked, (0, 0))
果然,它奏效了:
这是我使用的完整代码。
import pygame
from pygame.locals import *
pygame.init()
display = pygame.display.set_mode((320, 240))
background = pygame.image.load("leaves.png").convert_alpha()
mask = pygame.image.load("mask-fuzzy.png").convert_alpha()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# draw
display.fill(Color(255, 0, 255))
masked = background.copy()
masked.blit(mask, (0, 0), None, pygame.BLEND_RGBA_MULT)
display.blit(masked, (0, 0))
pygame.display.flip()
如果您想要一个可变的掩码,您可以尝试手动编辑一个 Surface 并将其用作掩码。
编辑:这是一个通过编辑 Surface 生成掩码的示例:
mask = pygame.Surface((320, 240), pygame.SRCALPHA)
for y in range(0, 240):
for x in range(0, 320):
if (x/16 + y/16) % 2 == 0:
mask.set_at((x, y), Color("white"))
它产生了这个结果:
现在我想在游戏中使用它!
pygame.surfarray.blit_array(Destination_surface, my_array)