【问题标题】:Texturing drawn shapes - python pygame纹理绘制的形状 - python pygame
【发布时间】:2015-01-15 19:06:11
【问题描述】:

我目前正在使用随机导入来创建五个随机 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()

【问题讨论】:

  • 实际想要的输出是什么?
  • 拍摄 png 图片或纹理并将其应用到形状的顶部,同时仍保持相同的形状
  • 不确定编辑文本形状是什么意思,但让我尝试重新解释一下我得到 5 个点并制作一个多边形,因此当使用 pygame.draw.polygon 命令时,每次运行程序 atm 时形状都会发生变化你只能使用 rgb 值有没有一种方法可以让我采用我刚刚绘制的形状并在仅形状顶部纹理一个 png,例如如果 png 是正方形,如果形状是圆形,它只会在圆圈内产生纹理跨度>
  • 这样更好。现在这是一个多边形,你不想使用 rgb 对
  • 我想以像草这样的纹理为例,并且只纹理那个多边形而不是白色背景

标签: python pygame textures transparency mask


【解决方案1】:

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

由于 Pygame 已经完成了繁重的工作,但只提供了纯色填充, 方法是使用 pygame 的结果作为纹理的剪贴蒙版。不幸的是,这可能比它应该的更困难。我希望我的样品在这里 对其他有相同需求的人很有用。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2021-04-30
    • 2016-10-31
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多