Pygame:如何绘制非矩形剪裁区域

时间:2011-05-09 18:31:19

标签: python draw pygame clip

您好我想设置pygame非矩形剪裁区域(在本例中为字符“P”),在那里它将严格限制,在哪里绘制另一个对象。

有没有选择?

非常感谢

2 个答案:

答案 0 :(得分:4)

让我们看看我是否正确地理解了你的问题:你想要将图像“blit”到一个表面上,但是通过一个只允许某些像素源实际上最终在表面上的掩模来实现它?

我有这个确切的问题,起初我认为它只能通过PIL实现。然而,在经过一些阅读和实验之后,事实证明它实际上可以在pygame相当模糊的“特殊标志”的帮助下完成。以下是一个有希望做你想做的功能。

def blit_mask(source, dest, destpos, mask, maskrect):
    """
    Blit an source image to the dest surface, at destpos, with a mask, using
    only the maskrect part of the mask.
    """
    tmp = source.copy()
    tmp.blit(mask, maskrect.topleft, maskrect, special_flags=pygame.BLEND_RGBA_MULT)
    dest.blit(tmp, destpos, dest.get_rect().clip(maskrect))

面罩应该是白色的,你希望它是透明的,否则就是黑色。

答案 1 :(得分:2)

这里是完整的代码,blit 2 rects on“Hello World!:D”文本。享受。

import pygame, sys, time
from pygame.constants import QUIT
pygame.init()

windowSurface = pygame.display.set_mode((800, 600), 0, 32)
pygame.display.set_caption('Hello World!')

WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

basicFont = pygame.font.SysFont("Times New Roman", 100)

text = basicFont.render('Hello world! :D', True, WHITE)

def blit_mask(source, dest, destpos, mask, maskrect):

        """
        Blit an source image to the dest surface, at destpos, with a mask, using
        only the maskrect part of the mask.
        """
        windowSurface.fill(WHITE)
        tmp = source.copy()

        tmp.blit(mask, destpos, maskrect, special_flags=pygame.BLEND_RGBA_MULT)  # mask 1 green


        tmp.blit(red, (destpos[0]+100,0), maskrect, special_flags=pygame.BLEND_RGBA_MULT)  # mask 2 red

        dest.blit(tmp, (0,0), dest.get_rect().clip(maskrect))

        pygame.display.update()

red = pygame.Surface((200,100))
red.fill(RED)

green = pygame.Surface((100,100),0)
green.fill(GREEN)

for a in range(700):
    blit_mask(text, windowSurface , (a,0), green, (0,0,800,600))

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()