纹理绘制的形状 - python pygame

时间:2015-01-10 00:17:51

标签: python pygame textures transparency mask

我当前使用随机导入创建五个随机x,y值并获取这些值并使用pygame.draw.polygon()命令绘制多边形。如果我有一个纹理方块,我想在这个形状的顶部应用,而不是仅仅使用rgb值,这将是最有效的方法吗?我想把生成的多边形放在下面并且不用硬编码它的形状,采用一般的纹理正方形并使所有绿色的新纹理就像从纹理方块中切出那样的形状。

import pygame,random
from pygame import*

height = 480
width = 640
#colors

red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
white = (255,255,255)
black = (0,0,0)

pygame.init()


points = [ ]

screen = pygame.display.set_mode((width,height))
pygame.display.set_caption("PlayBox")

r = random

for i in range(0,5):
    x = r.randrange(0,640)
    y = r.randrange(0,480)
    points.append([x,y])

running = True
while running == True:
    screen.fill(white)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            break

    pygame.draw.polygon(screen,green,points,0)
    pygame.display.update()      
pygame.display.update()

enter image description here

1 个答案:

答案 0 :(得分:1)

当然,一个选择是自己重新实施“桶填充”算法, 并复制多边形内的像素。这将是很多工作,并且在纯Python中会慢慢完成 - 但是,它会让你进入图像处理的基本基础http://en.wikipedia.org/wiki/Flood_fill

由于Pygame已经完成了繁重的工作,但只提供纯色填充, 要走的路是将pygame的结果用作纹理的剪贴蒙版。不幸的是,这可能比它应该更难。我希望我的样本在这里 对于有相同需求的人来说非常有用。

Pygame为我们提供了一些操纵表面颜色平面的基元, 但他们肯定是低水平的。另一件事是这些原语需要 numpy要安装 - 我不确定Window的pyagames安装程序是否包含它 - 否则,必须告诉运行项目的人自己安装numpy。

所以,要走的路是: 在表面加载您想要的纹理(减少头痛,相同大小的头痛) 最终图像),绘制您想要用纹理绘制的形状 在掩模表面,8bpp(B& W) - 作为透明贴图 纹理 - 他们使用pygame的surfarray实用程序将所有内容组合在一起:

# coding: utf-8

import random

import pygame

SIZE = 800,600

def tile_texture(texture, size):
    result = pygame.Surface(size, depth=32)
    for x in range(0, size[0], texture.get_width()):
        for y in range(0, size[1], texture.get_height()):
            result.blit(texture,(x,y))
    return result


def apply_alpha(texture, mask):
    """
    Image should be  a 24 or 32bit image,
    mask should be an 8 bit image with the alpha
    channel to be applied
    """
    texture = texture.convert_alpha()
    target = pygame.surfarray.pixels_alpha(texture)
    target[:] = pygame.surfarray.array2d(mask)
    # surfarray objets usually lock the Surface. 
    # it is a good idea to dispose of them explicitly
    # as soon as the work is done.
    del target
    return texture

def stamp(image, texture, mask):
    image.blit(apply_alpha(texture, mask), (0,0))


def main():
    screen = pygame.display.set_mode(SIZE)
    screen.fill((255,255,255))
    texture = tile_texture(pygame.image.load("texture.png"), SIZE)
    mask = pygame.Surface(SIZE, depth=8)
    # Create sample mask:
    pygame.draw.polygon(mask, 255, 
                        [(random.randrange(SIZE[0]), random.randrange(SIZE[1]) )
                         for _ in range(5)] , 0)

    stamp(screen, texture, mask)
    pygame.display.flip()
    while not any(pygame.key.get_pressed()):
        pygame.event.pump()
        pygame.time.delay(30)


if __name__ == "__main__":
    pygame.init()
    try:
        main()
    finally:
        pygame.quit()