gpt4 book ai didi

python - Pygame - 有没有办法只在掩码中进行 blit 或更新

转载 作者:太空狗 更新时间:2023-10-30 02:04:50 26 4
gpt4 key购买 nike

pygame 中是否有任何方法可以在掩码内将某些内容 blit 到屏幕上。例如:如果您有一个蒙版,其中除了左上角和全黑图像之外的所有位都设置为 1,并且不更改图像,您能否保持左上角(与蒙版相同)清晰?只有更新掩码(而不是矩形)才会有所帮助。

最佳答案

好的,如果我没有正确理解你的问题,诀窍就是 BLEND_RGBA_MULT 标志。

出于好奇,我决定亲自测试一下。我从这张图片开始:

320x240 leaves

我制作了一张图像,在我希望图像显示的地方使用白色,在我想要遮盖的地方使用透明度。我什至给了它不同程度的透明度,看看我是否可以得到模糊 mask 。

Fuzzy circular mask

^^^ It's difficult to see the image because it's white on transparent, but it's there. You can just right click and download it.

I loaded the two images, making sure to use 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 将掩码 blit 到这个副本上,

masked.blit(mask, (0, 0), None, pygame.BLEND_RGBA_MULT)

...然后我将其绘制到屏幕上。

display.blit(masked, (0, 0))

果然,它起作用了:

result

这是我使用的完整代码。

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()

如果你想要一个可变 mask ,你可以尝试手动编辑一个表面并将其用作你的 mask 。

编辑:下面是一个通过编辑表面生成 mask 的示例:

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"))

它产生这样的结果:

checkerboard mask result

现在我想在游戏中使用它!

关于python - Pygame - 有没有办法只在掩码中进行 blit 或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16880128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com