Python 在精灵上绘制多边形';s表面,因为它';pygame中的s形象
我想在非矩形形状上运行碰撞检测。(不是从图像加载的形状)这些形状是多边形。我想将多边形绘制到它们自己的曲面上,这样我就可以从中生成一个碰撞遮罩,然后用它来检查与播放器的碰撞。现在,我的代码应该在每个块的曲面上绘制多边形形状,准备将其转换为碰撞遮罩。但出于某种原因,它似乎做得不对。这是我的密码:Python 在精灵上绘制多边形';s表面,因为它';pygame中的s形象,python,pygame,Python,Pygame,我想在非矩形形状上运行碰撞检测。(不是从图像加载的形状)这些形状是多边形。我想将多边形绘制到它们自己的曲面上,这样我就可以从中生成一个碰撞遮罩,然后用它来检查与播放器的碰撞。现在,我的代码应该在每个块的曲面上绘制多边形形状,准备将其转换为碰撞遮罩。但出于某种原因,它似乎做得不对。这是我的密码: import pygame import random screen = pygame.display.set_mode((800,800)) pygame.init() sprite_list = p
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()
你已经差不多做到了 在精灵中,为
Block.image
定义曲面(具有透明背景),将多边形绘制到该曲面中,然后从该曲面创建遮罩。如果不使用透明背景,则需要在颜色阈值中有一个>127
差异(或将其作为参数传递给)
顺便说一句,现在它在窗口中绘制黑色正方形(我假设这只是填充了黑色的表面,也不确定为什么会发生这种情况)
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