Обнаружение события мыши на маскированном изображении - PullRequest
0 голосов
/ 16 октября 2018

Я создаю игру с кликером, и у меня есть прозрачное изображение (которое я установил в Mask для Pixel Perfect Collision), но когда я также нажимаю на прозрачную часть, обнаруживается событие MOUSEBUTTONDOWN.


На самом деле, мой код в классе проигрывателя:

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 голосов
/ 17 октября 2018

В дополнение к 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 (не показан в примере).

...