我创建了一个Clicker游戏,我有一个透明图像(我在“像素完美碰撞的蒙版”中设置了该图像),但是当我同时单击透明部分时,就会检测到MOUSEBUTTONDOWN事件。
实际上,我在Player类中的代码是:
self.image = pygame.image.load(str(level) + ".png").convert_alpha()
self.mask = pygame.mask.from_surface(self.image)
self.image_rect = self.image.get_rect(center=(WW, HH))
和这个,在主循环中:
x, y = event.pos
if my_player.image_rect.collidepoint(x, y):
my_player.click()
因此,我希望仅在单击图像的彩色部分而不是透明背景时才触发click事件。
谢谢
答案 0 :(得分:3)
除了my_player.image_rect.collidepoint(x, y)
,还检查Mask.get_at
:
get_at()
如果设置了(x,y)的位,则返回非零。
get_at((x,y)) -> int
请注意,您必须将全局鼠标位置转换为蒙版上的位置。
这是一个可运行的示例:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
class Cat:
def __init__(self):
self.image = pygame.image.load('cat.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (300, 200))
self.rect = self.image.get_rect(center=(400, 300))
self.mask = pygame.mask.from_surface(self.image)
running = True
cat = Cat()
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
pos = pygame.mouse.get_pos()
pos_in_mask = pos[0] - cat.rect.x, pos[1] - cat.rect.y
touching = cat.rect.collidepoint(*pos) and cat.mask.get_at(pos_in_mask)
screen.fill(pygame.Color('red') if touching else pygame.Color('green'))
screen.blit(cat.image, cat.rect)
pygame.display.update()
此外,self.image_rect
应该按照惯例命名为self.rect
。这不是绝对必要的。但这仍然是一个好主意,可让您使用pygame的Sprite
类(示例中未显示)。