Pygame нажмите на изображение (не прямоугольник) - PullRequest
1 голос
/ 12 июня 2019

Это часть моего кода, где проблема:

button = pygame.image.load("button1.png")
screen.blit(button, (100, 100))

Это изображение выглядит так:

[1

Мне нужно увеличить значение переменной, когда пользователь нажимает на изображение.

Я пробовал некоторые решения, но большинство из них рисовали «невидимый» прямоугольник над изображением, и значение переменной увеличивалось, даже если кто-то нажимал на пустое пространство рядом с треугольником.

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

С модулем mask .

это довольно просто.

Из документов:

Полезно для быстрого обнаружения столкновений с идеальным пикселем. Маска использует 1 бит на пиксель для хранения коллизий.


Сначала создайте Mask из изображения

mask = pygame.mask.from_surface(button)

Затем, при проверке события щелчка мыши, проверьте, является ли точка в маске set .

Вот простой пример:

import pygame

def main():
    pygame.init()
    screen = pygame.display.set_mode((480, 320))
    button = pygame.image.load('button.png').convert_alpha()
    button_pos = (100, 100)
    mask = pygame.mask.from_surface(button)
    x = 0
    while True:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                return
            if e.type == pygame.MOUSEBUTTONDOWN:
                try:
                    if mask.get_at((e.pos[0]-button_pos[0], e.pos[1]-button_pos[1])):
                        x += 1
                        print(x)
                except IndexError:
                    pass

        screen.fill((80,80,80))
        screen.blit(button, button_pos)
        pygame.display.flip()

main()

Пример button.png для тестирования:

enter image description here

1 голос
/ 12 июня 2019

Вы можете использовать Surface.get_at () , чтобы проверить цвет пикселя, на котором щелкает мышь. Если это цвет фона (белый в вашем случае), вы рассматриваете его снаружи, в противном случае - внутри и запускаете действие.

Вот рабочий пример. Функция insideimage проверяет, что щелчок находится внутри поверхности button (прямоугольник), и проверяет цвет пикселя в координатах мыши. Возвращает True, если щелчок находится внутри поверхности, а цвет не белый.
Это работает, если цвет фона больше не используется внутри изображения.

import sys
import pygame

SCREENWIDTH = 500
SCREENHEIGHT = 500

pygame.init()
screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))

button = pygame.image.load("button1.png")
screen.blit(button, (100, 100))

def insideimage(pos, rsurf, refcolor):
    """rsurf: Surface which contains the image
    refcolor: background color, if clicked on this color returns False
    """
    refrect = rsurf.get_rect().move((100, 100))
    pickedcol = screen.get_at(pos)
    return refrect.collidepoint(pos) and pickedcol != refcolor

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONUP:
            valid = insideimage(event.pos, button, (255, 255, 255, 255))
            #(255, 255, 255, 255) this is color white with alpha channel opaque
            print(valid)

    pygame.display.update()
1 голос
/ 12 июня 2019

Нет простого способа сделать это в Pygame, кроме как вручную вычислить, где находится мышь, и выяснить, в треугольнике она или нет.

Загружаемое изображение (button1.png) являетсяквадратное изображение, и поэтому у Pygame или любой другой библиотеки нет возможности узнать, что это за «настоящая» форма.Вам придется либо сделать это самостоятельно, либо все будет в порядке, если пользователь сможет щелкнуть пробел.

...