在pygame中将多边形绘制到精灵表面作为其图像

3

我想在非矩形形状上运行碰撞检测。(不是从图像加载的形状) 这些形状是多边形。 我想将这些多边形绘制到它们自己的表面上,以便我可以从中生成碰撞掩码,然后再使用该掩码来检查与玩家的碰撞。 目前,我的代码应该将多边形形状绘制到每个块的表面上,准备好被转换为碰撞掩码。 但由于某种原因,它似乎没有正确执行。 这是我的代码:

import pygame
import random

screen = pygame.display.set_mode((800,800))
pygame.init()
sprite_list = pygame.sprite.Group()


class Block(pygame.sprite.Sprite):
    def __init__(self, size, pos):
        pygame.sprite.Sprite.__init__(self)
        self.size = size
        self.image = pygame.Surface([size[0], size[1]])
        self.rect = self.image.get_rect()
        self.rect[0] = pos[0]
        self.rect[1] = pos[1]

    def update(self):
        pygame.draw.polygon(self.image, [100,100,30], [((self.rect[0]+ self.size[0]/2),self.rect[1]), (self.rect[0], self.rect[1] + self.size[1]), (self.rect[0]+ self.size[0], self.rect[1] + self.size[1])])

for i in range(5):
    cube = Block((20,20), (random.randint(0,800),random.randint(0,800)))
    sprite_list.add(cube)

run = True

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    screen.fill((255,255,255))

    sprite_list.update()

    sprite_list.draw(screen)
    pygame.display.update()

顺便说一下,现在它正在窗口中绘制黑色正方形(我猜这只是填充了黑色的表面,不确定为什么会发生这种情况)。 - ants
1个回答

3

你已经接近成功了。

在你的精灵中,为Block.image定义一个带透明背景的表面(surface),将多边形绘制到该表面中,然后从中创建一个掩模(mask)。如果你不使用透明背景,则需要在颜色阈值(color-threshold)上有一个大于127的差异(或将其作为参数传递给mask.from_surface() )。

class Block(pygame.sprite.Sprite):
    def __init__(self, size, pos):
        pygame.sprite.Sprite.__init__(self)

        # create transparent background image
        self.image = pygame.Surface( size, pygame.SRCALPHA, 32 )  
        self.rect = self.image.get_rect()
        self.rect.topleft = pos

        # Draw a random polygon into the image
        points = getRandomPolygonPointList( random.randrange( 3, 12 ), size )
        pygame.draw.polygon( self.image, WHITE, points )

        # Create the collision mask (anything not transparent)
        self.mask = pygame.mask.from_surface( self.image )  

   def update( self ):
       pass  # TODO  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接