在蒙版图像Pygame上检测鼠标事件

时间:2018-10-16 20:51:29

标签: python events pygame mask

我创建了一个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事件。

谢谢

1 个答案:

答案 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()

enter image description here


此外,self.image_rect应该按照惯例命名为self.rect。这不是绝对必要的。但这仍然是一个好主意,可让您使用pygame的Sprite类(示例中未显示)。